黑马程序员技术交流社区
标题:
多重内部类嵌套访问
[打印本页]
作者:
姚宏
时间:
2013-11-26 10:54
标题:
多重内部类嵌套访问
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.f()");
}
}
public BigEgg(){
insertYolk(new Yolk());
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Egg e=new BigEgg();
e.g();
}
}
复制代码
是这样的,书上看到一个例子,分析不出来了
运行结果是:Egg.Yolk()
New Egg()
Egg.Yolk()
BigEgg.Yolk()
BigEgg.f()
作者:
freehiker
时间:
2013-11-26 12:45
本帖最后由 freehiker 于 2013-11-26 13:03 编辑
我标记了一下执行顺序,先写上代码,然后我再一步步说明
package test.java;
class Egg
{
protected class Yolk{
public Yolk(){
System.out.println("Egg.Yolk()"); // -> 1-1:Egg.Yolk(); 2-1-1:Egg.Yolk();
}
public void f(){
System.out.println("Egg.Yolk.f()");
}
}
private Yolk y=new Yolk(); // -> 1-1
public Egg(){
System.out.println("New Egg()"); //->1-2.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(){
//super(); -> 2-1
System.out.println("BigEgg.Yolk()"); // 2-1-2:BigEgg.Yolk();
}
public void f(){
System.out.println("BigEgg.f()"); // 3-1:BigEgg.f 因为Egg.Yolk下的f方法被覆盖
}
}
public BigEgg(){
//super(); -> 1
insertYolk(new Yolk()); // -> 2
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Egg e=new BigEgg();
e.g(); //-> 3
}
}
复制代码
/*
* 1.创建BigEgg()对象,BigEgg()的构造函数中隐含super(),所以会执行Egg()的构造代码,即先初始化Egg对象
* 2.初始化Egg对象时,先要初始化成员变量,即Yolk y=new Yolk();所以这时候就会输出"Egg.Yolk()"
* 3.接着通过Egg构造函数继续初始化Egg对象,这时就输出了"New Egg()";
* 4.执行insertYolk(new Yolk());语句,这里要初始化BigEgg.Yolk对象
* 5.和上面同样的道理,输出了父类构造函数中的"Egg.Yolk()"字符串
* 6.继续执行System.out.println("BigEgg.Yolk()");输出了BigEgg.Yolk()字符串
* 7.继续执行e.g(),因为BigEgg中没有g方法
* ,所以调用Egg中的g方法,此方法继续调用Egg.Yolk的f方法,因为Egg.Yolk的f方法被BiggEgg
* .Yolk的f方法覆盖,所以输出BigEgg.f()字符串
*/
作者:
quan23355
时间:
2013-11-26 12:55
首先,先从主函数开始分析,主函数进入栈内存
主函数先执行new BigEgg();这时便找到对应的类加载进方法区中,由于BigEgg继承了Egg类,因此在方法区中首先加载进来的是Egg类
Egg在加载的过程中会执行到这句private Yolk y=new Yolk();,接着便在堆内存中创建new Yolk()对象并且对应的构造函数也就进栈了,
这时就输出Egg.Yolk()了,Yolk构造函数出栈,new Yolk()对象赋给Yolk类的引用y,private Yolk y=new Yolk();执行完毕。
然后BigEgg类加载进方法区中,BigEgg类构造函数进栈,由于BigEgg类继承了Egg类因此BigEgg类中有了Egg类中的super引用,
并且在BigEgg类构造函数中的第一句执行super(),父类构造函数进栈,对Egg的子类进行初始化动作,这时便输出了New Egg()这句话,父类构造函数出栈,进行子类显示初始化,执行insertYolk(new Yolk());,在堆中再次创建new Yolk()对象并且对应的构造函数也就进栈了,此时在的Yolk类对象是Egg类中的内部类,并且继承了Egg中的Yolk类,和上面的分析一样,输出Egg.Yolk()后输出BigEgg.Yolk();最后执行e.g();输出BigEgg.f()
作者:
姚宏
时间:
2013-11-26 16:06
帅气 问题解决了两位 谢谢了 当时就是对内部类父类构造方法在子类中的疑问纠结
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2