疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

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.当继承的父类中抽象方法与实现的接口中的方法同名,但返回类型不同,则子类就必须写出每个方法,但这样的方法集同名,返回类型不一样则认为是同一方法,又不能构成重载,则就会编译出错