Java 内部类

Java的内部类包括四种类型:

Static member classes

Member classes

Local classes

Anonymous classes

 

1. Static member class

Static member class是类的一个静态成员,它只能访问上层类中的静态成员和静态方法

第一:Static member class访问Outer class的成员变量或方法的时候,必须先new 一个Outer的对象,而无法通过Outer.this.xxx或Outer.this.xxx()来访问

 

 

2. Member class

类似于Static member class,它也是类的一个成员,但是它跟实例关联的,所以能访问所有的方法和成员变量,甚至是父类的this指针

类前面的修饰符有public > protected > package > private 和其它是一样的。

 

在成员内部类中要注意两点,

第一:成员内部类中不能存在任何static的变量和方法;

第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。所以外部类的静态方法中要访问内部类的方法要先new Outer对象再new Inner对象才能访问

第三:在Inner类中声明的变量或方法如果跟Outer类重名或函数签名一致的话,是会覆盖外部类的变量或方法。此时必须通过Outer.this.xxx 或Outer.this.xxx() 来访问外部类的变量或方法

 

 1 package edu.sjtu.se.dclab.code;
 2 
 3 public class Outer {
 4     
 5     private String a;
 6     private String c;
 7     private static String b = "Outer static String";
 8     
 9     public static void staticPrint(){
10         System.out.println("Outer static method: staticPrint");
11     }
12     
13     public void print(){
14         System.out.println("Outer class method : print");
15     }
16     
17     public Outer() {
18         a = "Outer String a";
19         c = "Outer String c";
20     }
21     
22     class Inner{
23         private String a;
24         //private static String b= "xx";   //不能创建静态变量
25         
26         Inner(){
27             a = "Inner String a";
28         }
29         
30         public void print(){   //覆盖外部类的方法
31             System.out.println("Inner class method : print");
32         }
33         
34         public void test(){
35             //Access Outer Member
36             System.out.println("Outer.this.c = " + Outer.this.c);   //访问外部类的成员
37             //Access Outer Member
38             System.out.println("c = " + c);   //不重名,访问外部类的成员
39             //Access Outer Static Member
40             System.out.println("Outer.b = " + Outer.b);  //访问外部类的静态成员
41             //Access Inner Member
42             System.out.println("a = " + a);   //重名,默认访问内部类的成员
43             //Access Outer static method
44             staticPrint();   //访问外部类的静态方法
45             //Access Inner method
46             print();   //重名,访问内部类的方法
47             //Access Outer method  
48             Outer.this.print();  //重名,访问外部类的方法
49         }
50     }
51     
52     static class StaticInner{
53         public void test(){
54             System.out.println(new Outer().a);   //在静态内部类中,必须先new一个外部类的对象
55             staticPrint();   //直接访问外部类的静态方法
56         }
57     }
58     
59     public Inner getInner(){
60         return new Inner();
61     }
62     
63     public StaticInner getStaticInner(){
64         return new StaticInner();
65     }
66     
67     public static void staticTest(){
68         new Outer().getInner().print();   //外部类静态方法要访问内部类的方法,要先创建外部类对象,再获取内部类的对象,再调用方法
69     }
70 
71 }

 

 

3. Local class 

Local class是只在某个code block中可见的类,类似于方法中定义的变量

注意local class只能访问code block中是final的变量(内部的原因还不太懂)

 

4. Anonymous class

Anonymous class是一种没有名字的Local Class

 

posted @ 2014-08-26 11:33  longshaohang  阅读(206)  评论(0编辑  收藏  举报