Java核心技术读书笔记6-4 内部类

6.内部类

内部类即定义在另一个类中的类,使用内部类的主要原因有下面三点:
· 内部类可以访问该类定义所在作用域中的数据,包括私有数据
· 内部类可以对同包中的其它类隐藏起来
· 匿名内部类适用于回调代码

6.1 内部类语法规则
内部类的对象实际上为外部类对象的一个属性。
· 内部类只对其外围类可见,即只有外围类的方法或域可以构建或引用内部类的对象。调用构造器时可以直接调用或指定外部类对象调用:outerObj.new InnerClass();
· 内部类可以直接访问其外围类的私有域或方法。如果想要明确声明为外部类的域或方法(比如名称冲突时),使用OuterClass.this.的形式调用外围域或方法。
· 内部类可以直接使用外围类的构造函数,即使为私有的 new OuterClass(...);
· 内部类的静态域必须用final修饰,防止不同外部类对象的不同内部类对象静态域值不相同的情况。
· 内部类不能有静态方法。

内部类属于一套复杂的编译器机制,与虚拟机无关。编译器会将内部类翻译为一个普通类,并为其添加一个参数为外部类对象的构造器方便访问原外部类对象。对于内部类使用的外部类私有域,编译器会提供一个静态方法传入一个外部类对象然后返回该对象的这个私有域值。之后内部类对象就可以调用这个方法获取私有域了。

6.2 局部内部类
即在方法中定义的内部类,不能有修饰符,作用域完全被限制在方法块中。局部类只能引用定义为final的方法中的局部变量。

6.3 匿名内部类
使用定义类的形式构造一个类/接口的子类的对象并返回。需要实现的方法定义在块中。形式通常如下:
new SuperType(construction parameters){
inner class methods and data;
}
返回的是一个继承了SuperType类,且覆盖了某些属性或方法的类,然后调用SuperType(construction parameters)构造器的对象
匿名内部类可以实现回调,但目前最好的方式还是使用Lambda表达式完成相同任务。

一种快速初始化的方法:new ArrayList(){{add("a1"), add("a2")}}
外面的括号代表匿名类,内侧的括号代表对象构造块。
编译器同样会将匿名子类编译为一个普通子类。

6.3 静态内部类
有时候,使用内部类只是为了把一个类隐藏在另外一个类的内部,并不徐亚内部类引用外部类对象。为此,可以将内部类声明为static,以便取消产生的引用。
· 内部类除了不能引用外部类对象外其余特性与其它内部类的特性一样。
· 内部类还可以拥有静态域和静态方法。
· 接口中的内部类自动称为public和static

内部类有一种使用场景,例如你想要的一个实例方法返回两个以上的结果,你可以用一个列表或数组来存储,然后返回。此外,你还可以构建一个内部类,让该类拥有所有结果,这样就可以在返回时实例化类对象,设置属性,然后返回了。

posted @ 2021-11-12 16:19  芝芝与梅梅  阅读(40)  评论(0)    收藏  举报