java面对对象(六)--内部类、匿名内部类
内部类
可以在一个类的内部定义另一个类这种类成为内部类或嵌套类,比如:
1 class Outer{ 2 … 3 class Inner{ 4 …. 5 } 6 } 7 class Outer1{} // 这个Inner1不是Outer1的内部类,不在Outer1的类体括号内 8 class Innter1{ 9 …… 10 } 11 Class Outer2{ //Inner2虽然是在Outer2的方法内,但还是在Outer2的类体括号内,是内部类 12 …… 13 public void test(){ 14 class Inner2{ 15 …. 16 } 17 } 18 }
内部类有什么问题和好处:
- 问题:外部类不使用或不创建外部类对象,就不能直接创建内部类对象
- 好处:外部类的私有属性,内部类可使用,而且不破坏封装,这也是为什么内部类存在的重要原因
内部类的特性
- 内部类的特征与变量概念特性很相似
- 内部类的位置与变量位置相似
- 变量可分为实例变量(成员变量),局部变量,静态变量
- 内部类与变量相似,也可分为四种
内部类的分类
静态内部类,成员内部类,局部内部类,匿名内部类
成员内部类
1.使用成员内部类就象使用成员变量一样,在本类的主方法中则直接使用成员内部类,不用加上外部类的名字来访问。但在其他类的主方法中要使用成员内部类则就需要使用外部类.内部类来访问。
2.使用外部类名来访问内部类还因为一个内部类可能有不同的外部类
3.创建一个成员内部类对象必须先创建外部类的对象,因为成员内部类要访问外部类的成员
4.成员内部类可以访问外部类的所有属性
5.成员内部类中不能定义有静态属性
6.当外部类的成员与内部类成员,内部类中局部变量同名时,则使用三种不同方式访问
- 直接使用变量名则访问局部变量
- 使用this.变量名则访问内部类的成员
- 使用外部类名.this.变量名则访问外部类的成员
静态内部类
- 在成员位置上定义为static的内部类,称为静态内部类
- 静态内部类类似于静态变量,修饰静态变量的修饰符也可以修饰静态内部类
- 静态内部类与静态方法,静态属性相似,访问静态方法,静态属性用类名.属性名/方法名访问,但是在本类中可不用类名.来访问。静态内部类也一样,在本类方法中访问则不用加上外部类名来访问,若在其他类的方法中则要加外部类名.内部类名来访问。
- 静态内部类中只能访问外部类的静态成员和本内部类的成员
- 静态内部类中不能访问外部类的非静态成员
匿名内部类
1.匿名内部类是一种特殊的局部内部类,局部内部类可以转化为匿名内部类
2.局部内部类要转化为匿名内部类必须具备3个条件
- 首先是一个局部内部类,也是一个私有的内部类
- 该局部内部类实现一个接口或继承一个父类
- 局部内部类只new一次创建一个对象
3.匿名内部类就是无显式地声明某个类名来实现接口,而直接实现接口的方法的类
4.匿名内部类不能定义构造方法,因为匿名内部类是一个特殊局部内部类,它没有类名。
5.匿名内部类可以访问外部类的局部变量,但也要求外部类的局部变量是final型的才能访问
6.匿名内部类可以访问外部类的属性
7.匿名内部类可以在一个类的方法中创建,同样可以在一个类的主方法中实现。
8.当继承的父类中抽象方法与实现的接口中方法同名,同参数列表,同返回类型,则子类只写一个方法实现就可以了
9.当继承的父类中抽象方法与实现的接口中的方法同名,但返回类型不同,则子类就必须写出每个方法,但这样的方法集同名,返回类型不一样则认为是同一方法,又不能构成重载,则就会编译出错