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

理解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.  内部类标识符是外围类的名字+ $ +内部类的名字,如果内部类是匿名的,则会由编译器产生一个数字作为其标识符。

你可能感兴趣的:(理解Java内部类的基本特性(二))