成员内部类:
-
定义: 一个类可以定义在另一个类的内部,定义在类内部的类称之为Inner(内部类),其所在的类称之为Outer(外部类)
-
内部类通常只服务于外部类,对外不具备可见性
-
内部类对象通常是在外部类中创建的
-
内部类中可以直接访问外部类的成员(包括私有的)
这是因为内部类中有个隐式的引用指向了创建它的外部类对象
eg: 外部类名.this.
class Aoo{//Outer
private int num=0;
class Boo{//Inter
num = 1;//内部类中可以访问外部类的成员
Aoo.this.num = 1;//上面相当于这样写,这就是隐式的引用
this.num = 1;//编译错误,this是指向所在的对象或类,这里所在的Boo里并没有num这个变量
}
}
class Coo{
Aoo o1 = new Aoo();//正确
Boo o2 = new Boo();//错误,Boo是Aoo的内部类,对外不可见
}
匿名内部类:
- 若想创建一个类(派生类)的对象,并且对象只被创建一次,
此时该类不必命名,称为匿名内部类
格式:abstract class Doo{}//这是一个抽象类(超类) Doo o3 = new Doo(){ }//这里做了三件事:1.新建了一个Doo的派生类,但是没有类名 //2.new了一个派生类的对象,引用名为01 //3.大括号内为派生类的类体
- 匿名内部类中若想访问外部的变量,该变量必须是final的
(在JDK1.8之前有此要求,JDK1.8可以不加final了)
经典面试题:
问:内部类有独立的.class吗?
答:有,虽然写代码的时候没有写在独立的class里,但是编译的时候会自动生成一个Aoo$Boo.class