- 内部类是定义在类中的类,分为成员内部类,局部内部类,静态内部类 和匿名内部类
1.成员内部类
- 成员内部类定义在类中的成员位置;
- 成员内部类中的对象可以随心所欲的访问外部类的成员;
- 成员内部类中的变量名如果和外部类中的变量名相同的话,会发生隐藏现象;this.变量名 访问的是内部类的变量; 外部类名.this.变量名; 访问的是外部类的成员变量;
- 外部类的方法要访问内部类的成员时,需要创建对象,用对象去访问.
Inner i=new Inner(); - 在其他类去创建成员内部类对象时,需要提前创建一个外部类对象:
外部类名.内部类名 对象名 = 外部类对象().内部类对象();
Outter.Inner i = new outter.new Inner();
2.局部内部类
- 局部内部类是定义在类的方法中的类
- 局部内部类可以直接访问外部类的成员,包括私有;
- 局部内部类访问局部变量时,需要加上final修饰,否则编译失败;
(局部变量随着方法调用完毕而消失,而当前这个局部变量被局部内部类的对象访问,在堆内存中对象不会被立即回收,它还在继续使用这个局部变量,需要将这个变量定义为常量,常驻内存,以便局部内部类对象对该局部变量的访问) - 局部内部类类似成员变量,不可以加 public、protected、private 以及 static 修饰符
- 外部类的方法如果要访问局部内部类的成员,依然要创建局部内部类的对象;
- 其他类不能直接访问局部内部类,但是可以通过创建外部类对象,调用局部内部类所在的方法;
3.静态内部类
-
静态内部类是成员内部类加上static 修饰符后的类
-
静态内部类只能访问外部类的静态成员;
-
同样静态变量和方法不可以定义在成员内部类中,但是可以定义在静态内部类中;
-
静态内部类类似于静态方法,不需要依靠外部类的对象;在没有外部类对象的时候依然可以创建静态内部类对象
-
其他类创建静态内部类的对象:
外部类名.内部类名 对象名 = new 外部类名.内部类名() ;
Outer.Inner i = new Outer.Inner() ;
4.匿名内部类
- 匿名内部类是局部内部类的一种简化形式;
- 匿名内部类是唯一一种没有构造器的类
- 匿名内部类的语法:
new 接口名(){
重写方法;
}; - 其中接口名可以换成抽象类名;匿名内部类实际上是接口的子实现类的对象,使用匿名内部类可以省略子实现类;
- 匿名内部类经常用于方法参数的传递,或者接口的方法重写并调用;