写点什么

Java 类构造函数的调用顺序

用户头像
michaelliu
关注
发布于: 2020 年 04 月 29 日
Java 类构造函数的调用顺序

面试题中经常这样的题目,分析子类父类构造函数的调用顺序,下面开始分情况讨论父类子类构造函数的调用顺序:



先创建两个类 A 和 B,其中 B 继承 A



public class A {
public A() {
System.out.println("A的无参构造函数");
}
public A(String msg) {
System.out.println("A的有参构造函数: " + msg);
}
public void print() {
System.out.println("A的print方法");
}
}
public class B extends A{
public B() {
System.out.println("B的无参构造函数");
}
public B(String msg){
// super(msg); //此句代码表示调用父类A的有参构造函数,不加此句代码则表示调用父类A的默认无参构造函数
System.out.println("B的有参构造函数: " + msg);
}
public void print() {
System.out.println("B 的print方法");
}
public void add(){
System.out.println("A 的add方法");
}
}



调用上述类:



public static void main(String[] args) {
// TODO Auto-generated method stub
B b = new B();
B b1 = new B("hello");
b.print();
b.add();
}



运行结果:



A 的无参构造函数
B 的无参构造函数
A 的无参构造函数: hello
B 的有参构造函数: hello
B 的 print 方法
A 的 add 方法



从运行结果可得出以下结论:



  • 实例化无参子类 B 时,先调用父类 A 的无参构造函数,再调用子类 B 的无参构造函数;

  • 实例化有参子类 B 时,先调用父类 A 的默认无参构造函数,再调用 B 的有参构造函数;若要调用 A 的有参构造函数,则在类 B 的有参构造函数的第一行加上 super(msg) 这句代码。

  • 子类 B 调用方法时有两种情况:一是如果子类 B 中的方法和父类 A 中的 print 方法一致时,则调用子类 B 中 print 的方法,但是可通过super.print()调用父类中的print方法;二是如果子类 B 中无 add 方法而父类 A 中有 add 方法时,则子类 B 的示例直接调用父类 A 中的 add 方法;

  • 父类 A 不能调用子类 B 中的方法和变量



用户头像

michaelliu

关注

Stay hungry, stay foolish. 2017.10.24 加入

120 %

评论

发布
暂无评论
Java 类构造函数的调用顺序