首页 > 代码库 > 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 内部类