当前位置: 代码迷 >> Java相关 >> [讨论]Thinking in Java 3中的一个程序
  详细解决方案

[讨论]Thinking in Java 3中的一个程序

热度:416   发布时间:2007-10-17 22:57:37.0
[讨论]Thinking in Java 3中的一个程序

class Glyph {
void draw(){System.out.println("Glyph.draw()");};
Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}

class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println(
"RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw() {
System.out.println(
"RoundGlyph.draw(), radius = " + radius);
}
}

public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
} ///:~
程序运行结果是:

Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
第二行调用了派生类的draw()函数,为什么?

搜索更多相关的解决方案: draw  Thinking  Java  radius  Glyph  

----------------解决方案--------------------------------------------------------
程序过程:
1。先执行父类构造函数,由于draw()被重写,所以执行子类函数;子类构造函数执行前radius=0
2。执行子类构造函数,得到radius=5,实例化完成

版主给点意见!!!!
----------------解决方案--------------------------------------------------------
子类创建了一个对象,先调用父类的构造方法,但是在父类的构造方法里面,却调用了一个动态绑定的方法,而且这个动态绑定的方法在子类被覆盖了。所以,父类的构造方法中的draw()会去掉用子类被覆盖掉的draw(),而不是父类本身的draw()。要注意的是,子类并没有被完全初始化好就调用了其动态绑定的方法,可能会产生一些意想不到的后果,最好不要这样写
----------------解决方案--------------------------------------------------------
这就是动态绑定方法所起的副作用.请记住一点.只要是非static或者非private或着非final的方法(因为这些方法是编译时期绑定的),调用的都会是最底层被覆盖的方法。
----------------解决方案--------------------------------------------------------
楼主正解,因为只有这样才能真正体现出多态的思想

否则子类重写就没什么很大的意义了

----------------解决方案--------------------------------------------------------
回复:(hwoarangzk)子类创建了一个对象,先调用父类...
劳烦通俗一点讲!
谢谢!

----------------解决方案--------------------------------------------------------
其实已经很通俗了,等你学到一定的程度就自然懂了

刚学的时候,不可能什么都能理解的,这些都是需要一个过程的

----------------解决方案--------------------------------------------------------
版主能不能简单说下动态绑定是怎么一回事
----------------解决方案--------------------------------------------------------
动态邦定是一种调用方法的机制。正是有了它才有了所谓的多态。具体点就是说在程序编译的时候不确定执行哪段代码,只有到了运行的时候才能动态的决定调用什么样的方法。
----------------解决方案--------------------------------------------------------
  相关解决方案