新浪微博 Github

Java知识点:内部类

内部类class文件命名规则

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

普通内部类

语法注意点:

  • 在普通内部类中不允许定义任何的静态成员,否则Compile Error。
 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行:实例化内部类之前必须要有一个外部类的对象,内部类的类型是:<Outer>.<Inner>。

静态内部类

 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行:创建静态内部类的对象的方法:<Outer>.<Inner> in = new <Outer>.<Inner>();
  • 静态内部类其实不像内部类,因为不需要创建外部类实例就能创建内部类实例。

匿名内部类

 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 }

 注意点:

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

 

posted @ 2013-07-25 18:52  xiazdong  阅读(1281)  评论(2编辑  收藏  举报