第九章-构造器与垃圾收集器
本章会讨论到堆,栈,范围,构造器,超级构造器,空引用。
在Java中,程序员在意内存中的两种区域:对象的生存空间堆(heap)和方法调用及变量的生存空间栈(stack)。
当Java虚拟机启动时,它会从底层的操作系统取得一块内存,并以此区段来执行Java程序。至于有多少内存,以及程序员是否可以调整它都要看Java虚拟机与平台的版本而定。
Java的变量分为:实例变量和局部变量。
实例变量有默认值,原始默认值是0/0.0/false,引用的默认值是null。
再谈创建对象
Duck myDuck=new Duck();
new Duck()实际是在调用Duck的构造函数。构造函数看起来很像方法,但不是方法。这是一段只有在创建对象的时候才会执行的程序代码。
如果程序员没有写出构造函数,则编译器会给出默认的构造函数。
//构造函数,名称和类名相同,没有返回类型
public Duck() {
}
构造函数的一个关键特征是它可以再对象被赋给引用变量之前就执行。这代表程序员有机会在任何人取得对象的引用变量之前介入对象的构造过程。
但是不建议使用setSize(),最好直接在构造函数中初始化。
//构造函数举例
public class Duck {
int size;
public Duck(int duckSize) {
System.out.println("Quack");
size=duckSize;
System.out.println("size is "+size);
}
public Duck() {
//指定默认值
size=28;
}
}
public class UseDuck {
public static void main (String[] args) {
Duck d=new Duck(42);
}
}
一个可以有多个构造函数(可以理解为是一种重载),一定需要一个不含参数的构造函数。
只有当类没有任何一个构造函数时,编译器才会帮助程序写出不含参数的构造函数。如果程序员已经写了含参数的构造函数,则也必须自己写出不含参数的构造函数。
如果一个类有多个构造函数,则他们的参数一定要不一样。所谓不一样,指的是参数的顺序和类型,只要是不一样即可(和重载相同)。
也有的类无法提供默认值,也就没法提供无参数的构造函数,比如Java API中的Color类,构造函数的三个int参数代表RGB三色的构造函数。
//正确
Color c=new Color(3,45,200);
//错误,编译器会告知没有这样的构造函数
Color c=new Color();
父类和继承与构造函数之间的关系。
在创建某个对象时,,对象会取得所有实例变量(包括从父类继承来的)所需的空间。