您的位置:程序门 -> java -> j2se / 基础类



初始化与内部类的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


初始化与内部类的问题
发表于:2007-03-08 20:39:27 楼主
看了3天内部类,感觉我开始犯糊涂了,看下下面代码,本来这个code是目的是演示覆盖内部类的,然而这个用法我认为确实很容易理解   ,但是我糊涂了他的整个代码的初始化过程,我可能对继承,内部类概念搞混了看下面代码:

import   com.bruceeckel.simpletest.*;

class   egg2   {
    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   {
    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();
        e2.g();
        monitor.expect(new   string[]   {
            "egg2.yolk() ",
            "new   egg2() ",
            "egg2.yolk() ",
            "bigegg2.yolk() ",
            "bigegg2.yolk.f() "
        });
    }
}  
这里首先打印出的是   "egg2.yolk() ",我的初始化思路是   首先产生了一个y对象   private   yolk   y   =   new   yolk();所以他先调用了基类内部类构造器中   public   yolk()   {   system.out.println( "egg2.yolk() ");   }第一个         "egg2.yolk() ",就输出了,之后
egg2   e2   =   new   bigegg2(),e2产生了bigegg2类的对象并向上转型为基类egg2,首先先调用基类构造器,   public   egg2()   {   system.out.println( "new   egg2() ");   }第2个结果输出了 "new   egg2() ",然后是导出类的构造器初始化但构造器public   bigegg2()   {   insertyolk(new   yolk());   }却产生了一个内部类的一个对象,然而这个对象的创建首先调用了其基类yolk   的构造器   public   yolk()   {   system.out.println( "egg2.yolk() ");   }结果输出打印了第3个值   "egg2.yolk() ",之后就开始对导出类yolk的初始化public   yolk()   {   system.out.println( "bigegg2.yolk() ");   }输出了第四个bigegg2.yolk() ",由于insertyolk()方法   将bigegg2()   中yolk对象向上转型为y,通过后期动态绑定,调用g(),方法中f实际调用的是public   void   f()   {
            system.out.println( "bigegg2.yolk.f() ");,最后 "bigegg2.yolk.f() "的结果输出了,我是这样理解的,不知道思路对不对,我现在对继承与基类,外部类与内部类他们之间关系的差异弄混了,请高手指点下!

发表于:2007-03-08 20:55:421楼 得分:0
楼主真是太巧了,今天我也刚刚看到这里,也是这本书,我也头疼啊,高手支招把
发表于:2007-03-09 10:09:572楼 得分:0
这个其实和内部类没什么关系吧?
实例化类的时候先实例化参数(field),然后构造(constructor)。
构造的时候先构造父类,构造父类前先实例化父类的参数。如此循环。

有一个问题是如下代码
abstract   class   a   {
  public   a()   {
      createa();
  }
 
  public   abstract   a   createa();
}

class   b   extends   a   {
  private   a   a   =   null;
  public   a   createa()   {
    this.a   =   new   b();
    return   this.a;
  }
}
在createa方面跟踪的时候你会发现b.a的确!=null,   但是在你使用b的其他方法用到b.a的时候发现是null.
最后b.a是null.
因为初始化b.a,   构造b的时候调用了a的构造,   调用了createa方法,实际上是b里面实现的,   给b.a赋值.   然后构造b,   实例化b.a,也就是执行a   =   null;这句话,   最后b.a变成null.

从这里可以看到private   a   a   =   null;这句话实际上是分2个阶段执行的.   如果没有如上的写法,   你不会感到任何的问题.
发表于:2007-03-09 13:06:343楼 得分:0
3楼的哥们bradwoo8621()   ,感谢你帮我重新复习了一下继承初始化的概念,也许你这句话,才是我真正忽略或者迷惑的地方“实例化类的时候先实例化参数(field),然后构造(constructor)。”当打印输出第一个结果:     "egg2.yolk() ",实际上是首先初始化成员变量private   yolk   y   =   new   yolk();     y即是,然而y产生了一个对象引用,他的构造器就被调用了,     public   yolk()   {   system.out.println( "egg2.yolk() ");   },所以第一输出的是 "egg2.yolk() "!和我之前思想(这里首先打印出的是   "egg2.yolk() ",我的初始化思路是   首先产生了一个y对象   private   yolk   y   =   new   yolk();所以他先调用了基类内部类构造器中   public   yolk()   {   system.out.println( "egg2.yolk() ");   }第一个         "egg2.yolk() ",就输出了)在思想上还是有很大差异的,不知道我这次理解的对不对,请赐教!谢谢


快速检索

最新资讯
热门点击