13、什么是内部类?Static Nested Class 和 Inner Class 的不同。 内部类就是在一个类的内部定义的类,内部类中不能定义静态成员,内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中,如下所示: public class Outer { int out_x = 0; public void method() { Inner1 inner1 = new Inner1(); public class Inner2 //在方法体内部定义的内部类 { public method() { out_x = 3;
} } Inner2 inner2 = new Inner2(); } public class Inner1 //在方法体外面定义的内部类 { } } 在方法体外面定义的内部类的访问类型可以是 public,protecte,默认的,private 等4种类型,这就好像类中定义的成员变量有4种访问类型一样, 它们决定这个内部类的定义对其他类是否可见;对于这种情况,我们也可以在外面创建内部类的实例对象,创建内部类的实例对象时, 一定要先创建外部类的实例对象,然后用这个外部类的实例对象去创建内部类的实例对象,代码如下: Outer outer = new Outer(); Outer.Inner1 inner1 = outer.new Innner1(); 在方法内部定义的内部类前面不能有访问类型修饰符,就好像方法中定义的局部变量一样,但这种内部类的前面可以使用 final 或 abstract 修饰符。 这种内部类对其他类是不可见的其他类无法引用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。 这种内部类必须是先定义,后使用,即内部类的定义代码必须出现在使用该类之前,这与方法中的局部变量必须先定义后使用的道理也是一样的。 这种内部类可以访问方法体中的局部变量,但是,该局部变量前必须加 final 修饰符。
在方法体内部还可以采用如下语法来创建一种匿名内部类,即定义某一接口或类的子类的同时,还创建了该子类的实例对象,无需为该子类定义名称: public class Outer { public void start()
{ new Thread( new Runable(){ public void run(){}; } ).start(); } } 最后,在方法外部定义的内部类前面可以加上 static 关键字,从而成为 Static Nested Class,它不再具有内部类的特性,从狭义上讲,它不是内部类。Static Nested Class 与普通类在运行时的行为和功能上没有什么区别,只是在编程引用时的语法上有一些差别,它可以定义成 public、protected、默认的、 private 等多种类型,而普通类只能定义成 public 和默认的这两种类型。在外面引用 Static Nested Class 类的名称为“外部类名.内部类名”。 在外面不需要创建外部类的实例对象,就可以直接创建 Static Nested Class,例如,假设 Inner是定义在 Outer 类中的 Static Nested Class, 那么可以使用如下语句创建 Inner 类: Outer.Inner inner = newOuter.Inner(); 由于 static Nested Class 不依赖于外部类的实例对象,所以,static Nested Class 能访问外部类的非 static 成员变。当在外部类中访问 Static Nested Class 时,可以直接使用 Static Nested Class 的名字,而不需要加上外部类的名字了, Static Nested Class 中也可以直接引用外部类的 static 的成员在变量, 不需要加上外部类的名字。 在静态方法中定义的内部类也是 Static Nested Class,这时候不能在类前面加 static 关键字,静态方法中的 Static Nested Class 与 普通方法中的内部类的应用方式很相似,它除了可以直接访问外部类中的 static 的成员变量,还可以访问静态方法中的局部变量, 但是,该局部变量前必须加 final 修饰符。
|