P239-
《Head First Java》20200925读书笔记
实例变量
如果局部变量生存在栈上,那么实例变量呢?
当你要新建一个CellPhone()时,Java必须在堆上帮CellPhone找一个位置。
这会需要多少空间呢?
足以存放该对象所有实例变量的空间。
没错,实例变量存在于对象所属的堆空间上。
记住对象的实例变量的值是存放于该对象中。
如果实例变量全都是primitive主数据类型的,则Java会依据primitive主数据类型的大小为该实例变量留下空间。
int需要32位,long需要64位,以此类推。
Java并不在乎私有变量的值,不管是32或32,000,000的int都会占用32位。
但若实例变量是个对象呢?
如果CellPhone对象带有一个Antenna对象呢?
也就是说CellPhone带有Antenna类型的引用变量呢?
当一个新建对象带有对象引用的变量时,此时真正的问题是:
是否需要保留对象带有的所有对象的空间?
不是这样的。
无论如何,Java会留下空间给实例变量的值。
但是引用变量的值并不是对象本身,所以若CellPhone带有Antanna,Java只会留下Antenna引用量而不是对象本身所用到的空间。
那么Antenna对象会取得在堆上的空间吗?
我们得先知道Antenna对象是在何时创建的。
这要看实例变量是如何声明的。
如果有声明变量但没有给它赋值,则只会留下变量的空间:
private Antenna ant;
直到引用变量被赋值一个新的Antanna对象才会堆上占有空间:
private Antenna ant = new Antenna();
public class CellPhone{
private Antenna ant;
}
public class CellPhone {
private Antenna ant = new Antenna();
}
创建对象的奇迹
现在你已经知道变量和对象的生存空间,我们可以开始更深入对象的创建。
要记得声明对象和赋值有3个步骤:声明引用变量、创建对象、连接对象和引用。
3个步骤的回顾:声明、创建、赋值
看起来很像是在调用Duck()这个方法
Duck myDuck = new Duck();//看起来像是在调用Duck()方法
并不是。
我们是在调用Duck的构造函数。
构造函数看起来很像方法,感觉上也很像方法,但它不是方法。