请教 Inner Class 的问题 不好意思,"private static Test monitor = new Test();" 这一句忘记删除了。请还要考虑这一句。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 inner class 首先要初始化!同时inner class 之间的继承 的初始化顺序和其他没有inner class一样!! e2.g();->y.f(); ->y = new Yolk();->public Yolk() { System.out.println("Egg2.Yolk()"); }你看明白了吗,因为你在 y.f()的时候用到了 y=new Yolk() 实例化了Yolk ,而Yolk的构造函数有 System.out.println("Egg2.Yolk()");所以就有第一行打印出来了。 e2.g() ->y.f() ->y = new Yolk() ->public Yolk() { System.out.println("Egg2.Yolk()"); }看明白了吗, y = new Yolk();是实例化 Yolk,因为 Yolk构造函数里面有 System.out.println("Egg2.Yolk()"); 所以就打印出来了, 初始化过程首先应从父类的成员变量开始。 to 52741: 其实你所说的,我之前也怎么想,但总不踏实。 那inner class与普通变量是谁先初始化呢? 你都已经揭帖了。不知道你还能看到我的回复吗?其实这个程序应该这样理解!(当然普通变量是先初始化的,你应该跟踪一下看看程序的执行过程细节就明白多了)依此类推。想必你能懂了!!!还有一点声明,你可能误会了我第一次的帖子。我只是针对这个程序而言并不是说明内引类初始化在某个方法或者类之前的意思。如果语言没有表达清楚请你原谅!!!!代码:class Egg2 { +3+在这个类中首先初始化的是 private Yolk y = new Yolk();这句。由于new Yolk()所以找到内引类Yolk对其初始化找到它的构造函数打印了第一个数据 "Egg2.Yolk()",然后执行了Egg2类的构造函数打印了"New Egg2()",之后程序在回到+2+ BigEgg2类中找到构造函数,但是遇到new Yolk()。是它的内引类。所以又是由于内引类继承的关系重复了刚才的初始化原理(我就不多说了!) protected class Yolk { public Yolk() { System.out.println("Egg2.Yolk()"); } public void f() { System.out.println("Egg2.Yolk.f()");} } private Yolk y = new Yolk(); public Egg2() { System.out.println("New Egg2()"); } public void insertYolk(Yolk yy) { y = yy; } public void g() { y.f(); }}public class BigEgg2 extends Egg2 { +2+ 这里,本应该对GigEgg2进行初始化处理,但是由于它extends Egg2,所以程序到+3+ private static Test monitor = new Test(); public class Yolk extends Egg2.Yolk { public Yolk() { System.out.println("BigEgg2.Yolk()"); } public void f() { System.out.println("BigEgg2.Yolk.f()"); } } public BigEgg2() { insertYolk(new Yolk()); } public static void main(String[] args) { Egg2 e2 = new BigEgg2(); //+1+。程序首先从这里开始,由于new BigEgg2() 所以程序到---》2 e2.g(); }} API功能 java 正则表达式问题 用javac编译程序的时候出现不能识别SQLProxy代码的问题是怎么回事 我想用泛型写个这样的类,请大家帮忙看看 内部类的实际用途 计算字符串形式的表达式 怎么用程序下载整个网站? 一个APPLET求救 如何将一个值赋给long形变量? jb中的label或者textfield的左有对齐如何设置? 在Jscript中如何得到一个字符串中某个字符的个数,谢谢 如何让javaApplet进行socket通信
同时inner class 之间的继承 的初始化顺序和其他没有inner class一样!!
->public Yolk() { System.out.println("Egg2.Yolk()"); }你看明白了吗,因为你在 y.f()的时候用到了 y=new Yolk() 实例化了Yolk ,而Yolk的构造函数有 System.out.println("Egg2.Yolk()");
所以就有第一行打印出来了。
所以就打印出来了, 初始化过程首先应从父类的成员变量开始。
那inner class与普通变量是谁先初始化呢?
其实这个程序应该这样理解!(当然普通变量是先初始化的,你应该跟踪一下看看程序的执行过程细节就明白多了)依此类推。想必你能懂了!!!
还有一点声明,你可能误会了我第一次的帖子。我只是针对这个程序而言并不是说明内引类初始化在某个方法或者类之前的意思。如果语言没有表达清楚请你原谅!!!!代码:
class Egg2 { +3+在这个类中首先初始化的是 private Yolk y = new Yolk();这句。由于new Yolk()所以找到内引类Yolk对其初始化找到它的构造函数打印了第一个数据 "Egg2.Yolk()",然后执行了Egg2类的构造函数打印了"New Egg2()",之后程序在回到+2+ BigEgg2类中找到构造函数,但是遇到new Yolk()。是它的内引类。所以又是由于内引类继承的关系重复了刚才的初始化原理(我就不多说了!) protected class Yolk {
public Yolk() { System.out.println("Egg2.Yolk()"); }
public void f() { System.out.println("Egg2.Yolk.f()");}
}
private Yolk y = new Yolk();
public Egg2() { System.out.println("New Egg2()"); }
public void insertYolk(Yolk yy) { y = yy; }
public void g() { y.f(); }
}public class BigEgg2 extends Egg2 { +2+ 这里,本应该对GigEgg2进行初始化处理,但是由于它extends Egg2,所以程序到+3+
private static Test monitor = new Test();
public class Yolk extends Egg2.Yolk {
public Yolk() { System.out.println("BigEgg2.Yolk()"); }
public void f() {
System.out.println("BigEgg2.Yolk.f()");
}
}
public BigEgg2() { insertYolk(new Yolk()); }
public static void main(String[] args) {
Egg2 e2 = new BigEgg2(); //+1+。程序首先从这里开始,由于new BigEgg2() 所以程序到---》2
e2.g();
}
}