Flyingis

Talking and thinking freely !
Flying in the world of GIS !
随笔 - 156, 文章 - 16, 评论 - 589, 引用 - 0
数据加载中……

理解Java内部类的基本特性(二)

作者:Flyingis

4. 
内部类拥有其外围类的所有元素的访问权,当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会保存一个指向那个外围类对象的引用。然后,在访问此外围类的成员时,就是用那个“隐藏”的引用来选择外围类的成员。这与C++嵌套类的设计非常不同,在C++中只是单纯的名字隐藏机制,与外围对象没有联系,也没有隐含的访问权。

         另外,一个内部类被嵌套多少层并不重要,它能透明访问所有它所嵌入的外围类的所有成员。

5.  Java中实现C++的嵌套类功能也是通过嵌套类的机制来实现的,区别是C++中的嵌套类不能访问私有成员,在Java中则可以。

         Java中,使用嵌套类可以使得内部类对象与其外围类对象之间有联系,语法上是将内部类声明为static。而在普通的内部类中是不能有static数据、static字段和嵌套类的。通常,我们可以在一个普通的内部类中,通过一个特殊的this引用链接到其外围类对象,如外围类是Fruit,那么在内部类中应该通过Fruit.this来引用外围类的对象。

6.  内部类的继承比较特殊,我通过一个例子来向大家展示:

class Fruit {

  class Inner {}

}

public class Apple extends Fruit.Inner {

  Apple(Fruit f) {

    f.super(); //为什么要这样使用我也不明白

}

public static void main(String[] args) {

  Fruit f = new Fruit();

  Apple a = new Apple(f);

}

}

         其中为什么要外围类调用super()方法我也不清楚,希望有人指点!

7.  当继承某个外围类的时候,内部类并没有发生任何改变,基类和继承类中的两个内部类是完全独立的实体,各自在自己的命名空间内。如果明确继承某个内部类,则会覆盖原来的内部类。如:

public class A extends Atop {

  public Inner extends Atop.Inner {}

}

8.  局部内部类和匿名内部类在功能上基本相似,它们的区别在于,如果我们需要一个已命名的构造器,或者需要重载构造器,就要使用局部内部类,它可以提供多个内部类对象。匿名内部类只能用于实例初始化。

9.  内部类标识符是外围类的名字+$+内部类的名字,如果内部类是匿名的,则会由编译器产生一个数字作为其标识符。

posted on 2005-11-04 18:55 Flyingis 阅读(1948) 评论(4)  编辑  收藏 所属分类: JavaSE

评论

# re: 理解Java内部类的基本特性(二)[原创]  回复  更多评论   

其中为什么要外围类调用super()方法?
这个问题,think in java上有解释,
在第八章:接口和内隐类 ——继承inner classes
你可以去看看
2005-11-05 12:06 | allen

# re: 理解Java内部类的基本特性(二)[原创]  回复  更多评论   

内部类从运行时理解更简单:
只要不是 static 声明的内部类运行时,实例必定附着于一个外部类实例,而不能单独创建。
但是 static 内部类的运行时表现相同于外部类。
2005-12-13 11:23 | 笨笨

# re: 理解Java内部类的基本特性(二)[原创]  回复  更多评论   

文章中第六点我还是没有弄明白。为什么一定要声明调用基类的默认构造方法?
2005-12-13 12:28 | Flyingis

# re: 理解Java内部类的基本特性(二)  回复  更多评论   

不错过西
2005-12-30 17:32 | 南木林

只有注册用户登录后才能发表评论。


网站导航: