第9章:构造器与垃圾收集器
什么是栈与堆? 堆(heap)、栈(stack)
当Java虚拟机启动时,它会从底层操作系统中取得一块内存,以此区段来执行Java程序。实例变量保存在所属的对象中,位于堆上。如果实例变量是对象引用,则这个引用和对象都是在堆上。
构造函数与对象创建的三个步骤
对象创建的三个步骤:声明、创建、赋值。
构造函数,让你有机会介入 new 的过程。构造函数,没有显示的指定返回值类型,构造函数不会被继承。如果一个类,没有显示地编写构造器函数,Java编译器会默认地为该类添加一个没有参数的构造器函数。反之,Java编译器则不会再添加任何默认的构造函数。
Dog dog = new Dog();
什么构造器函数重载?
即一个类,有多个构造器函数,且它们的参数都不能相同,包括参数顺序不同、或者参数类型不同、或者参数个数不同。重载的构造器,代表了该类在创建对象时可以有多种不同的方式。
public class Mushroom {
// 以下五个构造器,都是合法的,即构造器重载
public Mushroom() {}
public Mushroom( int size ) {}
public Mushroom( boolean isMagic ) {}
public Mushroom( boolean isMagic, int size ) {}
public Mushroom( int size, boolean isMagic ) {}
}
什么是构造函数链? super()
构造函数在执行的时候,第一件事就是去执行它的父类的构造函数。这样的链式过程,就被称为“构造函数链(Constructor Chaining)”。
class Animal {
public Animal() {
System.out.println("Making an Animal");
}
}
class Dog extends Animal {
public Dog() {
super(); // 如果没有这句,Java编译器会默认添加上这句,即调用父类的无参构造器
System.out.println("Making an Dog");
}
}
public class ChainTest {
public static void main(String[] args) {
System.out.println("Starting...");
Dog d = new Dog();
}
}
如果一个类,没有显示地书写构造器函数,Java编译器会为它添加上默认的无参构造器。如果在一个子类的构造器中没有使用super()调用父类的某个重载构造构造器,Java编译器会为这个子类的构造器默认添加上super(),即在子类的构造器函数中调用父类的无参构造器。
父类的构造器函数,必须在子类的构造器函数之前调用。在子类构造器函数中调用父类构造器时,必须与父类构造器的参数列表一致。
在类中,this 和 super 有什么区别? this() 和 super() 有什么区别?
使用 this() 可以在某个构造函数中调用同一个类的另外一个构造函数。 this() 只能在构造函数中使用,并且必须是第一行。 this() 和 super() 不能同时使用。
class Car {
private String name;
// 父类的有参构造器
public Car(String name) {
this.name = name;
System.out.println(name);
}
}
class MiniCar extends Car {
// 构造器
public MiniCar(String name) {
// 调用父类的有参构造器
super(name);
}
// 另一个构造器
public MiniCar() {
// 调用同一个类的另一个构造器
this("这里子类汽车的名称");
}
}
public class TestThis {
public static void main(String[] args) {
MiniCar mc1 = new MiniCar();
MiniCar mc2 = new MiniCar("动态的名字");
}
}
对象、变量的生命周期是怎样的?
对象的生命周期决定于对象引用变量的生命周期,如果引用还在,则对象也在;如果引用死了,对象会跟着被 GC 回收。当最后一个引用消失时,对象就会变成可回收的。
局部变量,只存活在对象的方法中,方法结束,局部变量就死了。
实例变量,存活在对象中,它的生命周期与对象一致。
Life 和 Scope 有什么区别?
Life,只要变量的推栈块还存在于堆栈上,局部变量就算是活着。局部变量会活到方法执行完毕为止。
Scope,局部变量的作用范围只限于它所在的方法中。当该方法调用别的方法时,该局部变量还活着,但不在目前的范围内,当被调用的其它方法执行完毕后,该总局变量的范围又跟着回来了。
什么是 null ?
当你把引用变量赋值为 null 时,你就等于抹除了遥控器的功能。对 null 对象使用圆点调用方法,会报空指针异常 NullPointerException。
标签:Head,Java,读书笔记,构造,父类,super,public,构造函数 From: https://www.cnblogs.com/LvJinshuai/p/16867959.html