Chapter10 内部类

可以将一个类的定义放在另一个类的定义的内部,这就是内部类。

内部类允许你将一些逻辑相关的类组织在一起,并控制位于内部的类的可视性。内部类拥有其外围类的所有元素的访问权。

10.2 链接到外部类

内部类可以访问其外围类的方法和字段,就像自己拥有它们似的。当某个外围类对象创建一个内部类对象时,此内部类对象会秘密捕获一个指向该外围类对象的引用。然后,在你访问此外围类成员时,就是用那个引用来选择外围类的成员。

10.3 使用.this 和 .new

如果你需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟 .this。

public class Outer{

   public class Inner{

        public Outer outer(){

             return Outer.this;

        }

   }

}

如果你需要创建某个内部类对象,就必须先创建外部类对象,然后使用外部类对象的引用紧跟.new的语法:

Outer outer=new Outer();

Outer.Inner inner=outer.new Inner();


10.5 在方法和作用域内的内部类

在方法的作用域内创建一个完整的类,这被称作局部内部类

10.6 匿名内部类

return new ClassName(){};

如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的。

10.7 静态内部类

(1)静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法)

(2)生成一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成:Outer.Inner in = new Outer.Inner();而不需要通过生成外部类对象来生成。

10.7 嵌套类

如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static,这通常被称作嵌套类。

普通的内部类对象隐式的保存了一个外部类对象的引用。然而当内部类static时,就不是这样了。嵌套类意味着:

(1)要创建嵌套类的对象,并不需要其外围类对象。

(2)不能从嵌套类的对象中访问非static的外围类对象。

普通的内部类不能包含static数据和static字段,也不能包含嵌套类。但是嵌套类可以包含所有这些东西。

10.8 为什么需要内部类

一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类对象。所以可以认为内部类提供了某种进入其外围类的窗口。

内部类拥有继承多个具体的或抽象的类的能力,从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效实现了”多重继承“。

内部类实现一个接口和外部类实现一个接口有什么区别呢?答案是:后者不能总享用到接口带来的方便,有时需要用到接口的实现。

10.8.1 闭包与回调

闭包:闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。通过这个定义可以看出内部类是面向对象中的闭包。因为它不仅包含外围类(创建它的作用域)信息,还拥有一个自动指向外围类对象的引用,在此作用域内,内部类有权限操作所有外围类成员。

回调的价值在于它的灵活性,可以在运行时动态决定需要调用什么方法。

你可能感兴趣的:(Chapter10 内部类)