标题:[讨论]Thinking in Java 3中的一个程序
只看楼主
littlec
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2007-10-10
 问题点数:0 回复次数:8 
[讨论]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 
2007-10-17 22:57
batwyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:88
专家分:0
注 册:2007-4-16
得分:0 
程序过程:
1。先执行父类构造函数,由于draw()被重写,所以执行子类函数;子类构造函数执行前radius=0
2。执行子类构造函数,得到radius=5,实例化完成

版主给点意见!!!!

2007-10-18 09:06
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
得分:0 
子类创建了一个对象,先调用父类的构造方法,但是在父类的构造方法里面,却调用了一个动态绑定的方法,而且这个动态绑定的方法在子类被覆盖了。所以,父类的构造方法中的draw()会去掉用子类被覆盖掉的draw(),而不是父类本身的draw()。要注意的是,子类并没有被完全初始化好就调用了其动态绑定的方法,可能会产生一些意想不到的后果,最好不要这样写

I'm here, as always...
2007-10-18 09:54
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
得分:0 
这就是动态绑定方法所起的副作用.请记住一点.只要是非static或者非private或着非final的方法(因为这些方法是编译时期绑定的),调用的都会是最底层被覆盖的方法。
2007-10-18 10:23
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 
楼主正解,因为只有这样才能真正体现出多态的思想

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

可惜不是你,陪我到最后
2007-10-18 11:15
thanatos
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2007-10-16
得分:0 
回复:(hwoarangzk)子类创建了一个对象,先调用父类...
劳烦通俗一点讲!
谢谢!

2007-10-18 11:25
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 
其实已经很通俗了,等你学到一定的程度就自然懂了

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

可惜不是你,陪我到最后
2007-10-18 11:37
batwyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:88
专家分:0
注 册:2007-4-16
得分:0 
版主能不能简单说下动态绑定是怎么一回事

2007-10-18 13:48
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
得分:0 
动态邦定是一种调用方法的机制。正是有了它才有了所谓的多态。具体点就是说在程序编译的时候不确定执行哪段代码,只有到了运行的时候才能动态的决定调用什么样的方法。
2007-10-18 14:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-178560-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.317321 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved