《Head First Java》20200925读书笔记

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的构造函数。
构造函数看起来很像方法,感觉上也很像方法,但它不是方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值