Java知识点:内部类

2014-11-24 10:11:44 · 作者: · 浏览: 0

Java知识点:内部类
内部类class文件命名规则
普通内部类、静态内部类:$.class,其中为外部类类名,为内部类类名。
方法内部类:$.class,其中为外部类类名,为内部类类名,为在外部类中定义的第number个Inner内部类。因为每个外部类(比如Outer)方法都能够定义一个名字相同的内部类(比如Inner),则命名这些名字相同的内部类的方法为:Outer$1Inner.class、Outer$2Inner.class。
匿名内部类:$.class,其中为外部类类名,为第number个匿名内部类,因为匿名内部类没有类名,因此只能用编号代替。
普通内部类

1 public class InnerClass01
2 {
3 public static void main(String[] args) {
4 Outer out = new Outer();
5 Outer.Inner inn = out.new Inner(); //创建内部类实例之前,必须创建外部类实例
6 inn.print();
7 }
8 }
9 class Outer
10 {
11 private int a = 1;
12 class Inner
13 {
14 public void print()
15 {
16 System.out.println("Inner " + a); //内部类能够访问外部类的私有实例变量
17 }
18 }
19 }上面的代码中:

第12~18行:定义了内部类,声明方法和定义普通类类似。
第16行:内部类能够访问外部类的私有实例变量。
第4~6行:实例化内部类之前必须要有一个外部类的对象,内部类的类型是:.
静态内部类

1 public class InnerClass04
2 {
3 public static void main(String[] args) {
4 Outer.Inner inn = new Outer.Inner();
5 inn.fun();
6 }
7 }
8 class Outer
9 {
10 static class Inner
11 {
12 public void fun()
13 {
14 System.out.println("hello");
15 }
16 }
17 }注意点:

第4行:创建静态内部类的对象的方法:. in = new .();
静态内部类其实不像内部类,因为不需要创建外部类实例就能创建内部类实例。
匿名内部类

1 public class InnerClass03
2 {
3 public static void main(String[] args) {
4 Outer out = new Outer();
5 out.addListener(new ClickListener(){ //匿名内部类,命名为:InnerClass03$1.class
6 public void onClick()
7 {
8
9 }
10 });
11 }
12 }
13 class Outer
14 {
15 public void addListener(ClickListener listener)
16 {
17
18 }
19 }
20 interface ClickListener
21 {
22 public void onClick();
23 }在监听器、触发器的使用中经常用到,上面是一个典型的匿名内部类的使用方法,这个匿名内部类是实现ClickListener接口的子类。

方法内部类
在方法内部定义内部类,一般不太用到。

注意点:

方法内部类不能使用方法的局部变量,因为内部类实例的生命周期可能比方法的局部变量长。
方法内部类可以和普通内部类一样,方法外部类的实例变量。
如果要创建方法内部类的实例,则必须在方法内部类声明后才能定义。
内部类的优先级
下面代码输出:内部类。


1 class Inner //第一个Inner类
2 {
3 public void print()
4 {
5 System.out.println("外部类");
6 }
7 }
8 public class InnerClass05
9 {
10 class Inner //第二个Inner类
11 {
12 public void print()
13 {
14 System.out.println("内部类");
15 }
16 }
17 public void fun()
18 {
19 Inner in = new Inner();
20 in.print(); //输出 “内部类”
21 class Inner //第三个Inner类
22 {
23 public void print()
24 {
25 System.out.println("方法内部类");
26 }
27 }
28 }
29 public static void main(String[] args) {
30 InnerClass05 inclass = new InnerClass05();
31 inclass.fun();
32 }
33 } 注意点:

优先级:方法内部类 > 普通内部类/静态内部类 > 外部类。