当前位置: 技术问答>java相关
急:内部类的继承问题?
来源: 互联网 发布时间:2015-04-21
本文导语: 急:内部类的继承问题? JAVA编程思想第七章(P172)问题: /*本程序演示如何从内部类继承*/ package c07; class Egg2 { protected class Yolk { public Yolk() { System.out.println("Egg2.Yolk()"); } public void f() { Syste...
急:内部类的继承问题?
JAVA编程思想第七章(P172)问题:
/*本程序演示如何从内部类继承*/
package c07;
class Egg2
{
protected class Yolk
{
public Yolk()
{
System.out.println("Egg2.Yolk()");
}
public void f()
{
System.out.println("Egg2.Yolk.f()");
}
}
//以上定义了内部类Yolk,它有两个public方法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
{
public class Yolk extends Egg2.Yolk //重载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();
e2.g();
}
}
它的运行结果是:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk().f()
请问它运行的顺序是怎样的?谢谢!
__________________
step by step
JAVA编程思想第七章(P172)问题:
/*本程序演示如何从内部类继承*/
package c07;
class Egg2
{
protected class Yolk
{
public Yolk()
{
System.out.println("Egg2.Yolk()");
}
public void f()
{
System.out.println("Egg2.Yolk.f()");
}
}
//以上定义了内部类Yolk,它有两个public方法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
{
public class Yolk extends Egg2.Yolk //重载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();
e2.g();
}
}
它的运行结果是:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk().f()
请问它运行的顺序是怎样的?谢谢!
__________________
step by step
|
1。一切从Main()开始,它是第一接口。
2。Egg2 e2 = new BigEgg2() 含有constructor调用new BigEgg2(), 又因
BigEgg2 derived from Egg2, 所以先对Egg2初始化。初始化Egg2由class
级对象y(语句:private Yolk y = new Yolk())开始。因为new Yolk()才
产生第一个输出“Egg2.Yolk()".
3. Egg2.Yolk()的第二次输出是由于BigEgg2对Egg2的方法(insertYolk())的
调用而触发Yolk()的constructor引起的。
4。类的自动初始化只针对其constructor及不包含在其方法内的变量和对象。
5。该方法曾在BigEgg2的constructor里被调用过。
2。Egg2 e2 = new BigEgg2() 含有constructor调用new BigEgg2(), 又因
BigEgg2 derived from Egg2, 所以先对Egg2初始化。初始化Egg2由class
级对象y(语句:private Yolk y = new Yolk())开始。因为new Yolk()才
产生第一个输出“Egg2.Yolk()".
3. Egg2.Yolk()的第二次输出是由于BigEgg2对Egg2的方法(insertYolk())的
调用而触发Yolk()的constructor引起的。
4。类的自动初始化只针对其constructor及不包含在其方法内的变量和对象。
5。该方法曾在BigEgg2的constructor里被调用过。
|
class Egg2 {
protected class Yolk {
public Yolk() {
System.out.println("Egg2.Yolk()");
}
public void f(){
System.out.println("Egg2.Yolk.f()");
}
}
//以上定义了内部类Yolk,它有两个public方法Yolk和f。
private Yolk y=new Yolk(); //类的实例不在方法中,所以它先执行。故先输出一个"Egg2.Yolk()";第一次
public Egg2() {
System.out.println("New Egg2()"); //这是第二次输出。
}
public void insertYolk(Yolk yy) { //这里又对Yolk 进行了一次construct。故再输出一次"Egg2.Yolk()".第三次
y=yy;
}
public void g() { //此处调用的是子类的。
y.f();
}
}
public class BigEgg2 extends Egg2 {
public class Yolk extends Egg2.Yolk {//父类的完了以后调用子类的construct.故这是第四次输出。
public Yolk() {
System.out.println("BigEgg2.Yolk()");
}
public void f(){
System.out.println("BigEgg2.Yolk().f()");
}
}
public BigEgg2(){//父类的construct 完了,开始子类的。调用了父类的方法
insertYolk(new Yolk()); //在这里又对Yolk 进行construct.
}
public static void main(String[] args) {
Egg2 e2=new BigEgg2(); //开始construct.由于包含继承,所以先去找Egg2类
e2.g(); //constuct结束,开始e2.g();调用子类的g()方法。
}
}
protected class Yolk {
public Yolk() {
System.out.println("Egg2.Yolk()");
}
public void f(){
System.out.println("Egg2.Yolk.f()");
}
}
//以上定义了内部类Yolk,它有两个public方法Yolk和f。
private Yolk y=new Yolk(); //类的实例不在方法中,所以它先执行。故先输出一个"Egg2.Yolk()";第一次
public Egg2() {
System.out.println("New Egg2()"); //这是第二次输出。
}
public void insertYolk(Yolk yy) { //这里又对Yolk 进行了一次construct。故再输出一次"Egg2.Yolk()".第三次
y=yy;
}
public void g() { //此处调用的是子类的。
y.f();
}
}
public class BigEgg2 extends Egg2 {
public class Yolk extends Egg2.Yolk {//父类的完了以后调用子类的construct.故这是第四次输出。
public Yolk() {
System.out.println("BigEgg2.Yolk()");
}
public void f(){
System.out.println("BigEgg2.Yolk().f()");
}
}
public BigEgg2(){//父类的construct 完了,开始子类的。调用了父类的方法
insertYolk(new Yolk()); //在这里又对Yolk 进行construct.
}
public static void main(String[] args) {
Egg2 e2=new BigEgg2(); //开始construct.由于包含继承,所以先去找Egg2类
e2.g(); //constuct结束,开始e2.g();调用子类的g()方法。
}
}
|
始化顺序:
1。单一类(Class) :先初始化类中的Class变量,然后是构建器中的代
码(包含相应的方法调用)。
2。内部类(Inner Class): 先初始化内部类,后外部类。
3. 构建器(Constructor):先初始化父类的构建器,再初始化子类的构
建器。(只要调用类的对象,就会自动查找该类的
构建器)
1。单一类(Class) :先初始化类中的Class变量,然后是构建器中的代
码(包含相应的方法调用)。
2。内部类(Inner Class): 先初始化内部类,后外部类。
3. 构建器(Constructor):先初始化父类的构建器,再初始化子类的构
建器。(只要调用类的对象,就会自动查找该类的
构建器)