成员内部类和匿名内部类

成员内部类:

  • 定义: 一个类可以定义在另一个类的内部,定义在类内部的类称之为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

猜你喜欢

转载自blog.csdn.net/zhyue28/article/details/88648128
今日推荐