父类和子类构造函数调用的先后顺序
如果一个类中没有构造方法,JVM会在其中添加默认的无参构造方法。在子类的构造方法中,JVM会自动在构造方法中通过super()方法调用父类的构造方法,所以会先执行父类的构造方法再执行子类的构造方法。
public class Parent {
public Parent(){
System.out.print("parent\n");
}
}
public class Son extends Parent {
public Son(){
// super(); JVM会自动添加上super()方法以调用父类的构造函数
System.out.print("son\n");
}
}
public class Test {
public static void main(String[] args){
Son son = new Son();
}
}
输出结果:
父类和子类变量及方法的调用
public class Parent {
int i = 0;
public void method1(){
System.out.print("parent method1\n");
}
public void method2(){
System.out.print("parent method2\n");
}
}
public class Son extends Parent{
int i = 2;
public void method2(){
i = i + 1;
System.out.print("son method2\n");
}
}
public class Test {
public static void main(String[] args){
Parent p = new Son();
p.method1();
p.method2();
System.out.print(p.i+"\n");
}
}
得到结果:
Parent p = new Son()
这段代码,是对父类的引用,对子类的实例化,子类中没有重写method1()
方法,所以调用的时父类的method1()
方法,而子类重写了method2()
方法,所以调用的是子类的method2()
方法。另外,既然是对父类的引用,所以这里的i是指父类的i,所以得到结果为0;