锁定老帖子 主题:关于java的构造方法
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-13
public class A { public A() { p(); } protected void p() { System.out.println("A"); } } class B extends A { @Override protected void p() { System.out.println("B"); } public static void main(String[] args) { new B(); } } 问我输出的是什么,我想当然的答A,结果错了。应该是B。 又做了个小实验,将class A改成抽象类、p()改成抽象方法,是同样的调用顺序。 abstract public class A { public A() { p(); } protected abstract void p(); } class B extends A { @Override protected void p() { System.out.println("B"); } public static void main(String[] args) { new B(); } } 由此得出,java的继承中调用构造方法时,使用的是就近原则。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-10-13
引用 由此得出,java的继承中调用构造方法时,使用的是就近原则。
应该是this关键字,这个时候指向的是B类 |
|
返回顶楼 | |
发表时间:2011-10-13
这是多态,因为B覆盖了父类A的方法,所以执行调用的虚拟机执行了子类的方法
|
|
返回顶楼 | |
发表时间:2011-10-13
B.p()已经@Override了其父类的方法,故B的构造函数里调用p()的时候使用的是B的实例的p()方法。
|
|
返回顶楼 | |
发表时间:2011-10-14
lz火星来的吗?!
|
|
返回顶楼 | |
发表时间:2011-10-14
引用 lz火星来的吗?!
真的是不了解啊~! 最近才发现的,就记录一下。 呵呵,基础不牢固啊~! |
|
返回顶楼 | |
发表时间:2011-10-14
难道你不知道方法列表只有一个,p方法在B中已经没有A的了。属性还可以调的到。
|
|
返回顶楼 | |
发表时间:2011-10-14
i3587616 写道 难道你不知道方法列表只有一个,p方法在B中已经没有A的了。属性还可以调的到。
你说的方法列表只有一个什么意思。 |
|
返回顶楼 | |
发表时间:2011-10-14
其实在B内部还是可以调到A的p()方法的,只要这样用:
super.p(); |
|
返回顶楼 | |
发表时间:2011-10-14
工厂模式不就是这么搞的么,lz火星了
|
|
返回顶楼 | |