内部类:在类或方法中定义的类(常用于事件监听)
优点:
1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整
2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏
3.方便编写事件驱动程序
4.方便编写线程代码
内部类基础
包括四种:成员内部类、局部内部类、匿名内部类、静态内部类
A. 成员内部类:类中类,最普通的类,可以用各种修饰符。
成员内部类可以无条件访问外部类的所有成员方法和成员属性(包括private成员和static成员)
!!!注意:当成员内部类拥有和外部类同名的成员变量或成员方法时,会发生藏匿现象,即默认情况下访问的是成员内部类的成员,要访问外部类的同名成员:
外部类.this.成员变量
外部类.this.成员方法
反之:外部类不能随心所欲的访问内部类的成员
外部类访问内部类:(创建成员内部类对象)
外部类、内部类 变量名=new 外部类().new 内部类();
例如:Outer outer=new Outer;
Outer.Inner i=outer.new Inner();//必须通过Outer对象来创建
B. 局部内部类:定义在一方法或作用域里边的类。与成员内部类的区别在于:局部内部类的访问仅限于方法内或作用域内
!!!注意:局部内部类相当于方法里面的一个局部变量,不能有访问修饰符、static修饰符
C.匿名内部类:前提:存在一个类或者接口,平时运用最多,优点:
1.方便编写事件监听代码
2.更容易维护
!!!注意:匿名内部类不能有访问修饰符,static修饰符;
匿名内部类是唯一一个没有构造函数的类,因此使用范围有限,大部分用于接口回调;一般来说,用来继承类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现和重写。
D.静态内部类:类中类,加上static,不依赖与外部类,不使用外部类的非静态成员变量和方法。
创建静态内部类对象:外部类.内部类 对象名=new 外部类.内部类();
例如:Person.Heart h=new Person.Heart();
为什么局部内部类和匿名内部类只能访问局部final变量?
答:局部内部类额和匿名内部类不能有访问修饰符,static修饰符