构造函数
输出结果如下:
public class A {
public A() {
}
}
构造函数看起来像方法,但是它并不是方法。它带有new的时候会执行程序代码,也就是新建一个对象的时候执行。
eg:A a = new A(); //严格来说,这是唯一在构造函数之外能够调用构造函数的方式。
在类中,即使我们没有编写构造函数,编译器也会帮助我们完成(默认是无参构造函数)
编译器会在我们没有写构造函数的时候给我们完成一个无参构造函数,如果我们已经写了一个有参数的构造函数,并且我们需要一个没有参数的构造函数,必须我们手动完成,编译器在已经有构造函数的前提下,是不会帮助我们完成构造函数的创建的。
当子类继承父类的时候,会先执行父类的构造方法,在执行子类的构造方法。
原因:当我们new一个对象的时候,子类的构造函数进入堆栈最上方的堆栈块,子类的对象调用父类的构造函数,导致父类的构造函数进入栈顶。执行的时候,先执行父类的构造函数,执行完成,父类的堆栈块会被弹出,接着执行子类的构造函数。先进后出。
super关键字
当父类中有多个构造函数,子类在创建对象的时候,会默认先执行父类的中的无参构造函数。编译器会自动在子类的构造函数中加入了调用父类的默认构造函数(调用父类的构造函数必须使用关键字super)
public class Demo01{
Demo01(){
super();
System.out.println("superA");
}
如果我们想要调用父类中的指定的构造函数,调用方法如下:
class Demo01{
Demo01(){
super();
System.out.println("superA");
}
Demo01(String s){
System.out.println("s------"+s);
}
}
public class Test02 extends Demo01{
Test02(){
super("aaa");
System.out.println("thisB");
}
public static void main(String[] args) {
Demo01 t = new Test02();
}
}
输出结果如下:
s------aaa
thisB
父类和子类相当于现实中的父子关系,我们都知道不可能先有儿子后有老子。