| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 849 人关注过本帖
标题:[讨论]构造器的调用!
只看楼主 加入收藏
wxhwjsw
Rank: 1
等 级:新手上路
帖 子:274
专家分:0
注 册:2006-6-15
收藏
 问题点数:0 回复次数:11 
[讨论]构造器的调用!
class Egg {
protected class Yolk {
public Yolk() { System.out.println( "Egg.Yolk()" ); }
public void f() { System.out.println( "Egg.Yolk().f()" ); }
}
private Yolk y = new Yolk( );
public Egg() { System.out.println( "new Egg()" ); }
public void insertYolk( Yolk yy ) { y = yy; }
public void g() { y.f(); }
}

public class BigEgg extends Egg {
public class Yolk extends Egg.Yolk {
public Yolk() { System.out.println( "BigEgg.Yolk()" ); }
public void f() { System.out.println( "BigEgg.Yolk().f()" ); }
}
public BigEgg() { insertYolk( new Yolk() ); }
public static void main( String[] args) {
Egg e = new BigEgg();
e.g();
}
}

大家认为这个程序输出的是什么!!

有能力的请解释哈!(可以把解释的内容写到语句的后面)

[此贴子已经被作者于2006-8-18 13:35:01编辑过]

搜索更多相关主题的帖子: 构造器 
2006-08-18 13:34
noshow
Rank: 2
等 级:新手上路
威 望:4
帖 子:1127
专家分:0
注 册:2006-4-21
收藏
得分:0 

我在.net下跑了后的结果是

Egg.Yolk()
new Egg()
Egg.Yolk()
BigEgg.Yolk()
BigEgg.Yolk().f()

不过还没弄明白
谁来解释解释



不过可以用F11单步执行看
很有意思啊

[此贴子已经被作者于2006-8-18 14:28:11编辑过]


此号自封于2006年11月30日
2006-08-18 14:22
sunnyxue
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2004-12-13
收藏
得分:0 
写,太麻烦了吧。

2006-08-18 15:43
NiceGirl
Rank: 2
等 级:新手上路
威 望:4
帖 子:909
专家分:0
注 册:2006-6-18
收藏
得分:0 

package ConsoleApplication1;

/**
* Class1 的摘要说明。
*/

class Egg
{
private Yolk y = new Yolk( );//四、构造内部类Egg.Yolk对象、调用其构造方法

protected class Yolk
{
public Yolk() { //十一、第二遍执行,打印Egg.Yolk(),返回BigEgg.Yolk
System.out.println( "Egg.Yolk()" ); //五、OK,无成员变量,执行方法体,打印Egg.Yolk()
} //六、返回Egg构造方法
public void f() { //十七、到这里打印Egg.Yolk().f();OK,返回main方法,执行完毕
System.out.println( "Egg.Yolk().f()" );
}
}

public Egg() { //三、执行构造方法体前初始化Egg类成员变量
System.out.println( "new Egg()" ); //七、执行方法体,打印new Egg(),父类构造方法执行完毕,返回子类BigEgg构造方法
}

public void insertYolk( Yolk yy ) { //十三、到这里了,赋下值,其实这步应该在子类中执行,只是子类中没有显式的写出继承的方法,
y = yy; //此处y是子类中的BigEgg.Yolk的引用变量,执行完毕,返回BigEgg()
}

public void g() { //十六、这里其实也是在子类中隐式存在的,注意,这里的BigEgg.Yolk类型的y只能通过继承的方法访问,因为继承的y成员变量
//是私有的
y.f(); //十七、这里调用的是BigEgg.Yolk的重写的f()方法
}
}

public class BigEgg extends Egg
{
public class Yolk extends Egg.Yolk
{
public Yolk() { //十、此类BigEgg.Yolk又是派生类,调用父类Egg.Yolk的构造方法
System.out.println( "BigEgg.Yolk()" ); //十二、执行方法体、打印BigEgg.Yolk(),返回BigEgg方法后继续执行insertYolk
//注意:这里方法被重写
}
public void f() {
System.out.println( "BigEgg.Yolk().f()" ); //十八、打印BigEgg.Yolk().f(),返回main方法,程序执行完毕
}
}

public BigEgg() { //二、发现是派生类,所以先调用父类构造方法
insertYolk( new Yolk() ); //八、执行子类方法体、调用已继承的父类方法insertYolk,然后传参,发现参数是构造器,调用构造方法
//九、构造内部类BigEgg.Yolk的对象,调用BigEgg.Yolk构造方法
} //十四、方法执行完毕,返回main函数

public static void main( String[] args)
{
Egg e = new BigEgg(); //一、类加载完毕,无静态成员变量,首先执行入口方法main,然后执行该语句
e.g(); //十五、调用已继承的方法g(),打印Egg.Yolk().f()
}
}


请复制到。NET2003下观看


曾经以为百般艰难,蓦然回首,才发现已飞渡千山。。!
2006-08-18 16:06
wxhwjsw
Rank: 1
等 级:新手上路
帖 子:274
专家分:0
注 册:2006-6-15
收藏
得分:0 
。。。。还是没明白 最后一句怎么是输出子类中的东西   再去看哈书!!

一个人的快乐,不是因为他拥有的多,而是因为他计较的少.
2006-08-18 16:17
NiceGirl
Rank: 2
等 级:新手上路
威 望:4
帖 子:909
专家分:0
注 册:2006-6-18
收藏
得分:0 

因为那个f是子类中的f,调用的方法是重写了父类中的同名方法


曾经以为百般艰难,蓦然回首,才发现已飞渡千山。。!
2006-08-18 16:44
wxhwjsw
Rank: 1
等 级:新手上路
帖 子:274
专家分:0
注 册:2006-6-15
收藏
得分:0 

那个Y是父类的对像吧!!(向上转型得到的) 他为什么会调用的是子类的那个f

又或者是我理解错误  Y = YY  所以Y指向的是一个子类的引用!!!


一个人的快乐,不是因为他拥有的多,而是因为他计较的少.
2006-08-18 19:48
NiceGirl
Rank: 2
等 级:新手上路
威 望:4
帖 子:909
专家分:0
注 册:2006-6-18
收藏
得分:0 
这里体现多态性,把动态绑定好好看看

曾经以为百般艰难,蓦然回首,才发现已飞渡千山。。!
2006-08-18 20:14
wxhwjsw
Rank: 1
等 级:新手上路
帖 子:274
专家分:0
注 册:2006-6-15
收藏
得分:0 
哦 看来功力还不够。。。。


一个人的快乐,不是因为他拥有的多,而是因为他计较的少.
2006-08-18 20:38
chadmorrian
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-3-8
收藏
得分:0 
我来总结两点吧:1.构造函数被调用之前先要初始化成员变量(包括内部类)
2.父类部分先于子类的特有部分构造(这样才合逻辑)
2006-08-19 01:58
快速回复:[讨论]构造器的调用!
数据加载中...
 
   



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

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