ThinkingInJava 学习 之 0000001 一切都是对象
-- -- -- -- -- -- -- -- --
大杂烩 -- Java内存布局【图】以及java各种存储区【详解】
-- -- -- -- -- -- -- -- --
1. 用引用操纵对象
在Java中,一切都被视为对象。尽管一切都看作对象,但操纵的标识符实际上时对象的一个“引用(reference)”。
可以将这一情形想象成用遥控器(引用)来操纵电视机(对象)。只要握住这个遥控器(引用),就能保持与电视机(对象)的连接。当想改变频道或减少音量(改变属性值)时,实际操控的时遥控器(引用),再由遥控器(引用)来调控电视机(对象)。如果想在房间里四处走走(进入方法),同时仍能调控电视机,那么只需携带遥控器(引用)而不是电视机(对象)。
此外,即使没有电视机,遥控器亦可独立存在。也就是说,你拥有一个引用,并不一定需要有一个对象与它关联。(对象不一定必须有引用才可以存在,比如匿名对象)。
2. 创建对象(new、反射、序列化、克隆)
通常用new操作符来实现这一目的。
String str = new String("lime");
2.1 对象存储的位置
Q:程序运行时,对象是怎么进行放置安排的?
Q:内存时怎样分配的?
1. 寄存器:
最快的存储区,位于处理器内部
2. 堆栈:
存放对象引用。位于通用RAM中,堆栈指针向下移动,则分配内存;向上移动,则释放内存。
创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期。
3. 堆:
一种通用的内存池(位于RAM区),用于存放所有的Java对象。堆不同与堆栈的好处时:编译器不需要知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当需要一个对象时,只需用new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。用堆进行存储分配和清理需要更多时间:垃圾回收机制。
4. 常量存储:
常量值通常直接存放在程序代码内部。
5. 非RAM存储:
流对象、持久化对象
2.2 特例:基本类型
直接存储“值”,并置于堆栈中。
包装器类
高精度数字:BigInteger、BigDecimal(以速度换取精度)
BigInteger : 支持任何精度的整数。
BigDecimal : 支持任何精度的定点数。
2.3 数组
1. 基本数据数组:编译器将基本数据数组所占的内存全部置零,以确保数组的安全初始化。
2. 对象数组 : 当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字null。一旦Java看到null,就知道这个引用还没有指向某个对象。在使用任何引用钱,必须为其指定一个对象;如果试图使用一个还是null的引用,在运行时将会报错。
3. 对象的销毁:堆栈、堆
1. 作用域(堆栈)
在C、C++和Java中,作用域由花括号{}的位置决定。
作用域决定了在其内定义的变量名的可见性和生命周期。
在作用域里定义的变量只可用于作用域结束之前。
{int x = 12;{int x = 12; //Illegalint y = 96;}int y = 96; //ok}
2. 对象的作用域(堆)
Java对象不具备和基本类型一样的生命周期。 当new创建一个Java对象时,它可以存活于作用域之外(花括号之外)。
如:
{String s = new String("This is a string");} // End of scope
引用s(堆栈)在作用域终点就消失了。然而,s指定的String对象(堆)仍然占据内存空间。在这一小段代码中,我们无法在这个作用域之后访问这个对象,因为对它唯一的引用已超出了作用域的范围。扩展:在程序执行的过程中,怎样传递和复制对象引用。
由new创建的对象(堆),会一直保留下去。由Java的垃圾回收器来监视new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便共其他新的对象使用。
4. 自定义数据类型:类
class className{}
1. 字段和方法
在类中可以设置两种类型的元素:字段、方法
字段可以是任何类型的对象,可以通过其引用与其进行通信;也可以时基本类型中的一种。如果字段时对某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象相关联。
每个对象斗殴用来存储其字段的空间;普通字段不能在对象见共享(static 域 可以共享)。
引用一个对象的成员,需要使用连接句点"."
Data data = new Data();data.i = 131;
2. 基本成员默认值
若类的某个成员时基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值。
基本类型 | 默认值 |
boolean | false |
char | '\u0000'(null) |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
当变量作为类的成员使用时,Java才确保给定其默认值,以确保那些是基本类型的成员变量得到初始化,防止产生程序错误。
5. 方法、参数和返回值
方法的基本组成部分:名称、参数、返回值、方法体。
void functionName(String msg){//dosomething}
返回类型描述的是在调用方法之后从方法返回的值。
参数列表给出了要传给方法的信息的类型和名称。
方法名和参数列表唯一地标识一个方法,称为方法签名。
Java中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用(static 方法 可以通过类调用),且对象必须能执行方法调用。
调用方法的行为通常被称为 发送消息给对象 。
如:
long time = date.getTime();
消息时getTime(),对象时date。
1. 参数列表
Java中任何传递对象的场合中,都是引用传递。
6. 构建程序须知
1. 名字可见性
反转域名
2. 运用其他构件
import
3. static 关键字
通常来说,当创建类时,就是在描述那个类的对象的外观与行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才内分配,其方法才供外界调用。
有两种情形用上述方法时无法解决的:
1. (静态域)只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象。
2. (静态方法)希望某个方法不与包含它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能够调用这个方法。
通过static关键字可以满足这两方面的需要。
当声明一个事物时static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使未创建某个类的任何对象,也可以调用其static方法或访问其static域。
通常,你必须创建一个对象,并用它来访问数据或方法。因为非static域和方法必须知道它们一起运作的特定对象。
7. 第一个Java程序:HelloWorld
8. 注释和嵌入式文档
9. 编码风格
10. 总结
练习:
啦啦啦
转载于:https://www.cnblogs.com/ClassNotFoundException/p/7570825.html
ThinkingInJava 学习 之 0000001 一切都是对象相关推荐
- Java学习之一切都是对象(二)
注:本博客内容是本人在看<Jave编程思想>这本书时从该书上抄录下来的一些片段.这里也强烈建议各位读者去购买这本书进行阅读学习. 一.用引用操纵对象 在Java的世界中,一切都被视为对象, ...
- Java编程思想学习-《第二章 一切都是对象》
第2章 一切都是对象 尽管Java是基于C++的,但是相比之下,Java是一种更"纯粹"的面向对象程序设计语言.Java语言假设我们只进行面向对象的程序设计.也就是说,在开始用Ja ...
- 「从源码中学习」面试官都不知道的Vue题目答案
前言 当回答面试官问及的Vue问题,我们除了照本宣科的回答外,其实还可以根据少量的源码来秀一把,来体现出你对Vue的深度了解. 本文会陆续更新,此次涉及以下问题: "new Vue()做了什 ...
- 从零开始学习jQuery (五) 事件与事件对象
本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...
- JavaScript学习笔记05【高级——DOM对象】
w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...
- 在python中、处理的一切都是对象_Python 3+ 一切都是对象
对于 Python 来说,一切都是对象 . 这句话很重要,当你对某个特性不了解时,回想下这句话也许就能想通 一个整数一个对象,一个浮点数也是一个对象,一个函数也是一个对象 >>> i ...
- JavaScript学习总结(九)——Javascript面向(基于)对象编程
转载自 JavaScript学习总结(九)--Javascript面向(基于)对象编程 一.澄清概念 1.JS中"基于对象=面向对象" 2.JS中没有类(Class),但是它取了 ...
- Delphi面向对象学习随笔一:类与对象的关系
Delphi面向对象学习随笔一:类与对象的关系 作者:巴哈姆特 http://www.cnpack.org (转载请注明出处并保持完整) 工作几年了,总想做点总结,于是有了这篇东西,叫随笔吧呵 ...
- 一切都是对象,一切都是指针,一切都是东西(python的编程哲学)
终于把1000多页的python学习手册啃完了.从来没有从深层次上去理解一门编程语言,学习c是如此,学习java也是如此.总觉得这些语言就是拿来用的.不用管它为什么要创造出来. 这几天认真系统的学习了 ...
- JavaScript学习(三十)—事件对象
JavaScript学习(三十)-事件对象 大家好,我是小王,一个很喜欢Coding的小女孩. 很喜欢这句话:人数没有白走的路,每一步都算数,关注我,后期分享更多资源! 事件对象:该对象记录了和事件相 ...
最新文章
- 关于函数的调用是否加括号的问题
- 号称迄今为止最快,.NET6带来了什么?
- vue移动端html5页面根据屏幕适配的四种解决方法
- android 高度百分比,如何在Android中进行百分比高度和宽度?
- 红黑树和平衡二叉树的区别_面试题精选红黑树(c/c++版本)
- o在linux是什么权限,Linux权限管理基本知识大全
- 什么是MVC和MVVM,两个例子读懂它们!
- 利用Python进行数据分析--数据聚合与分组运算1
- poj 1226 Substrings kmp 好题,我调试了一晚上啊!!汗
- ZTE 5G UPF 性能白皮书
- 给定两个水壶,一个可以装4升水,一个能装3升水,水壶上没有任何度量标记。有一水龙头可以用来往壶中灌水。问题是怎样在能装4升的水壶里面恰好只装2升水
- 两条平滑曲线相乘_对三次贝塞尔曲线过点平滑中尖角和交叉现象的优化
- api 接口管理工具
- html中三角函数表示什么,三角函数的化一公式
- 网易游戏策划笔试2019春招题解
- Oracle学习(七)——————————————查询进阶
- 展开说说:Adobe XD 哪个版本好用?
- android lcm,Android的LCM知识点(4)
- Java基础面试题精选汇总,备战面试突破篇--直击offer
- Self-Supervised Deep Blind Video Super-Resolution