内部类的好处:
- 将类的代码隐藏在其他类内部。
- 内部类对象可以访问外部类的所有元素 。
- 解决多继承的问题。
- 内部类可以有多个实例,与外部类独立。
- 单个外部类可以让多个内部类实现同一个接口或继承同一个类。
一、成员内部类:
public class Outer{
class Inner{
}
}
获取内部类对象实例的方式
- 普通内部类对象隐式的保存了一个指向外部类对象的引用。
- new 外部类 . new 内部类。
- 外部类对象 . new 内部类。
- 外部类对象 . get方法。
10.3 使用.this和.new
- 内部类中获取外部类对象的引用:外部类.this 。
- 外部类中访问内部类对象的引用:new 内部类()。
- 外部类中创建内部类对象必须使用外部类对象来创建内部类对象。
二、10.5 方法内部类
- 方法中创建类。
- 类前不能加访问说明符,类中不能有静态成员。
-
使用场景:
实现了某接口,创建并返回对其的引用。
- 需要创建一个类辅助解决问题,但不希望这个类公共可用。
public Object getInner{
class Inner{
...
}
}
三、10.6 匿名内部类
使用场景:
- 只用到类的一个实例,因为不会有对象名称,无法再次调用。
- 实例化的同时重写方法,等同于创建子类继承父类并重写方法或实现接口。
- 没有静态成员
test.getRead(new Person(){ //实例化的同时重写方法,等同于创建子类继承父类并重写方法。
@Override
public void read(){
...
}
})
四、10.7 静态内部类(嵌套类)
使用场景:
-
与普通内部类的区别:
普通内部类对象隐式的保存了一个指向外部类对象的引用,而静态内部类没有。
- 静态内部类创建对象不需要外部类对象。
普通内部类不能有static成员,而静态内部类可以。
public class Outer{
static class Inner{
}
}
静态内部类中,不能通过对象访问非静态的外部类对象。
- 创建静态内部类对象:外部类.内部类 类名 = new 外部类.内部类();
10.7.1 接口内部可以放静态内部类
正常情况接口内部不能放代码,但是静态内部类可以放,自动的public和static。public interface A{
void fun();
class Test implements A{
public void fun(){
...
}
...
}
}
10.9 内部类的继承
内部类对象隐式的包含对外部类对象的引用,所以在继承内部类的同时,构造器需要通过特殊语法初始化这个引用。
- 外部类对象 . super() ```java class Outer{ class Inner{} }
public class A extends Outer,Inner{ // A(){}不能通过编译。 必须通过外部类对象.super初始化内部类对象对外部类对象的引用。 A(Outer o){ o.super(); } } ```