内部类:
定义:
定义在另外一个类中的类,就是内部类。
编译后生成的两个独立的类:Outer.class 和Outer$Inner.class。
内部类的分类:
一、静态内部类:静态内部类定义在类中,任何方法外,用static修饰(属于类,不需要创建对象就可以使用,因为在加载.class文件的时候就已经加载到了内存的静态区了)
静态内部类只能访问外部类的静态成员。(原因同上)
创建静态类对象的方法,分两种情况:
1. 在外部类的外部,要创建一个静态内部类对象不需要外部类对象:
Outer.Inner in = new Outer.Inner();
注意:此时的类,仍然是一个类的成员,因此类名应该以类名.成员的格式去写,外部类名.内部类名 in = new 外部类名.内部类名
2. 在本类内部生成内部类对象的方式:
Inner in = new Inner();
二、成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列(首先是一个成员,然后这个成员是一个类)
在内部类中可以直接访问外部类的私有属性。
内部类和外部类的实例变量允许命名冲突。
在内部类中访问实例变量:this.属性
在内部类访问外部类的实例变量:外部类名.this.属性
创建成员内部类对象的方法,分两种情况:
1. 在外部类的外部,要创建一个成员内部类对象,要首先建立一个外部类对象,然后再创建一个成员内部类对象。
Outer out = new Outer();
Outer.Inner in = out.new Inner();
2.在本类内部生成内部类对象的方式:
1)在静态方法中:Inner in = new Outer().new Inner();
2)在非静态方法中:Inner in = this.new Inner();
成员内部类不可以有静态成员,这是因为静态属性是在加载类的时候创建,这个时候内部类还没有被创建。
三、局部内部类:在外部类的方法中定义的内部类
与局部变量类似,在局部内部类前不可以加修饰符public和private,其作用域为定义它的代码块。
局部内部类不仅可以访问外部类的实例变量,还可以访问外部类的局部变量,但要求外部类的局部变量必须为final的。
配合接口使用,来做到强制弱耦合。
在外部类的外部不可创建局部内部类对象,只能在局部内部类所在的方法中创建:
Inner in = new Inner();
四、匿名内部类:一种特殊的局部内部类
没有名字,也没有class、extends、implements关键字
条件:已定义接口或类(用匿名内部类实现接口或者继承该类并且重写父类的方法)
作用:用一种隐含的方式实现一个接口或继承一个类,并且只能创建一次实例。
实现方式:在某个语句中,new 父类/父接口名字(){ 类体中实现方法 }
例如:
TreesSet ts = new TreeSet(new Comparator(){
public int compare(Object o1, Object o2){
return 0;
}
}); ---new Comparator(){} (包括两步:1.定义一个内部类实现接口或继承父类,2.new了一个内部类的对象)
总结:
匿名内部类属于局部内部类,那么局部内部类的所有限制都对其生效。
匿名内部类是唯一一种无构造方法的类,因为构造器的名字必须和类名相同,而匿名内部类没有类名。
阅读(957) | 评论(0) | 转发(0) |