首页 > 代码库 > Java 内部类

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 Member36             System.out.println("Outer.this.c = " + Outer.this.c);   //访问外部类的成员37             //Access Outer Member38             System.out.println("c = " + c);   //不重名,访问外部类的成员39             //Access Outer Static Member40             System.out.println("Outer.b = " + Outer.b);  //访问外部类的静态成员41             //Access Inner Member42             System.out.println("a = " + a);   //重名,默认访问内部类的成员43             //Access Outer static method44             staticPrint();   //访问外部类的静态方法45             //Access Inner method46             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

 

Java 内部类