论坛首页 Java企业应用论坛

关于java的构造方法

浏览 7533 次
精华帖 (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的继承中调用构造方法时,使用的是就近原则。
   发表时间:2011-10-13  
引用
由此得出,java的继承中调用构造方法时,使用的是就近原则。

应该是this关键字,这个时候指向的是B类
1 请登录后投票
   发表时间:2011-10-13  
这是多态,因为B覆盖了父类A的方法,所以执行调用的虚拟机执行了子类的方法
0 请登录后投票
   发表时间:2011-10-13  
B.p()已经@Override了其父类的方法,故B的构造函数里调用p()的时候使用的是B的实例的p()方法。
0 请登录后投票
   发表时间:2011-10-14  
lz火星来的吗?!
0 请登录后投票
   发表时间:2011-10-14  
引用
lz火星来的吗?!

真的是不了解啊~!
最近才发现的,就记录一下。
呵呵,基础不牢固啊~!
0 请登录后投票
   发表时间:2011-10-14  
难道你不知道方法列表只有一个,p方法在B中已经没有A的了。属性还可以调的到。
0 请登录后投票
   发表时间:2011-10-14  
i3587616 写道
难道你不知道方法列表只有一个,p方法在B中已经没有A的了。属性还可以调的到。

你说的方法列表只有一个什么意思。
0 请登录后投票
   发表时间:2011-10-14  
其实在B内部还是可以调到A的p()方法的,只要这样用:
    super.p();
0 请登录后投票
   发表时间:2011-10-14  
工厂模式不就是这么搞的么,lz火星了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics