黑马程序员技术交流社区
标题:
关于构造函数的有趣现象
[打印本页]
作者:
darkads
时间:
2014-9-12 17:03
标题:
关于构造函数的有趣现象
在前一篇总结中,构造函数必然开始于this()或者super(),也就是说除了Object以外,所有类的构造函数都必然开始于同一类的其他构造函数,或者父类的构造函数。
class A {
public A() {
System.out.println("A无参构造函数");
show();
}
public void show() {
System.out.println("A show");
}
}
class B extends A {
protected int b = 222;
public B() {
System.out.println("B无参构造函数");
show();
}
public void show() {
System.out.println("b = " + b);
}
}
复制代码
在上面两个类中,B继承至A,并且重写了A的show()方法,AB都会在自己的无参构造函数中调用show()方法,new一个B对象,结果如下
A无参构造函数
b = 0
B无参构造函数
b = 222
复制代码
当执行到A的无参构造方法时,调用的是B类的show()方法而不是自己的,说明这时没有发生方法的分派,在实例化对象时,构造函数只会调用重写的方法。
我们使用如下方式在new一个A对象:
A a = new B();
A无参构造函数
b = 0
B无参构造函数
b = 222
复制代码
结果跟第一次没有什么不同,说明了构造函数只会调用子类重写的方法,不会发生多态。
更有意思的是,注意前面两次结果中b的值,在A的构造参数被调用时b的值为0,而A执行完毕后,b的值才被赋予了222,也就是说类的非静态成员变量的初始化,发生在构造函数执行期间,而且是父类的构造函数执行完毕之后才执行。
作者:
fantacyleo
时间:
2014-9-12 17:17
执行A的构造方法,调用B类的show,这就是多态啊。如果不是多态,A a = new B()应该调用A的show而不是B的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2