26-28 内部类
http://baike.baidu.com/view/7942850.htm?fr=aladdin
1、内部类就是在一个类的内部定义的类。
2、内部类中不能定义静态成员(方法体外定义的static nested class可以定义静态成员)。
3、内部类可以直接访问外部类中的成员变量(static nested class不能访问外部类中的非static成员变量)
4、内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中。
(1)方法体外
类前修饰可以public,protect,default,private(可以使用static,final,abstract),决定对其他类是否可见。
(1-1)方法体外的内部类,类似成员变量。创建内部类的实例对象时,一定要先创建外部类的实例对象,然后用它去创建内部类的实例对象。
(1-2)方法体外的内部类加上static,成为static nested class,不再具有内部类特性。狭义上说,它不是内部类,与普通类在运行时的行为和功能无区别,只是编译引用时的语法有区别。
可定义为4中访问权限类型,而普通类只有两种类型(public和默认)。
引用static nested class的名称为“外部类.内部类”,不需创建外部类实例。
能直接访问外部类的static成员变量,不能直接访问外部类的非static成员变量。
可以定义static成员变量。
(2)方法体中
类前修饰不能有4种访问类型修饰符(不可以使用static是因为方法体内局部变量也不可以是static的,可使用final或abstract),对其他类不可见。先定义后使用,只能在方法中实例化。
可以访问方法体中的final修饰的局部变量。方法中的final局部变量放在堆中,而非栈中。
(2-1)方法体中的内部类,类似局部变量。
(2-2)static方法体中的内部类也是static nested class。这是不能在类前面加static,它与普通方法中的内部类应用相似。
可以访问静态方法中final修饰的局部变量,还可以直接访问外部类中的static成员变量,不能直接访问外部类的非static成员变量。
(2-3)方法体中可以创建匿名内部类。即定义某一接口或类的子类的同时,还创建了该子类的实例对象,无需为该子类定义名称。匿名内部类必须继承其他类或实现其他接口。
public class Outer { static int x = 0; int y = 0; public void fun1(){ x=1; y=1; class C{//(2-1)方法体中的内部类,类似局部变量,前面不能有4种访问类型修饰符(可使用final或abstract),对其他类不可见。先定义后使用。 //这种内部类可以访问方法体中的final修饰的局部变量。 //static int i = 0;//static不行,static final可以 public void cFun(){ x=4; y=4; } } C c = new C(); //(2-3)方法体中可以创建匿名内部类 new Thread(new Runnable(){ public void run(){ } } ).start(); } public static void fun2(){ x=1; class D{//(2-2)static方法体中的内部类也是static nested class。这是不能在类前面加static //静态方法中的static nested class与普通方法中的内部类应用相似。 //除了可以直接访问外部类中的static成员变量,还可以访问静态方法中final修饰的局部变量。 //static int i = 0;//static不行,static final可以 public void dFun(){ x=5; //y=5;y不是static的,在static nested class中不可访问 } } D d = new D(); } public class A{//(1-1)方法体外的内部类,类似成员变量,4种访问权限来修饰决定对其他类是否可见 //static int i = 0;//static不行,static final可以 public void aFun(){ x=2; y=2; } } public static class B{//(1-2)方法体外的内部类加上static,成为static nested class,不再具有内部类特性。 //狭义上说,它不是内部类,与普通类在运行时的行为和功能无区别,只是编译引用时的语法有区别。 //可定义为4中访问权限类型,而普通类只有两种类型(public和默认) //引用static nested class的名称为“外部类.内部类”,不需创建外部类实例。 //能访问外部类的static成员变量 static int i = 0;//可以定义static成员。 public void bFun(){ x=3; //y=3;y不是static的,在static nested class中不可访问 } } public static void main(String[] args){ A a = new Outer().new A(); Outer.B b1 = new Outer.B(); B b2 = new B();//外部类中可以省略外部类名 } }
编译结果: