编写java程序就必须创建对象,早晚得释放它们,否则会出现内存不足的情况。
这一章讨论对象如何创建、存于何处、如何让保存和抛弃更有效率。
堆:存放对象及该对象的实例变量(也称为可垃圾回收的堆)
栈:存放方法及该方法的局部变量(即便是类似duck d=new duck()),d仅为duck的
引用,栈上存放的是d,因为被赋值之后,duck在堆上占有空间。
栈顶上的方法是正在执行的方法,执行完后就被释放
构造器:duck d=new duck(),可分为声明、创建、赋值的过程,duck()其实是在
调用duck的构造函数(编译器会写,也可自己写),因此构造函数的关
调键特征是能够在赋值给引用变量之前介入。
构造函数的特点:与类同名且无返回类型,public duck(){},构造函数可有
多个,参数必须不同(顺序不同或类型不同)
父类构造器:构造函数在执行时,第一件事是执行其父类的构造函数,连
锁反应到object的构造函数。实际上是不断将父类的构造函
数放置于栈顶上,直至object的构造函数位于最顶端,然后
逐个执行后释放。
父类的构造函数必须在子类的构造函数之前结束,因此
super()总是放在子类构造函数的第一行,有参数的父类构造
函数则需要在super、构造函数、创建对象时传入对应类型的
参数。
生命周期:局部变量的范围仅限于声明的方法之内,当方法调用其它方法时,局
部变量还活着,且状态被保存下来,活到方法执行完。
释放对象的引用中的对象有3种情况,可在方法结束时消失、可被赋值
到其他对象后消失、可设定为null后对象消失