内部类定义在一个外部类的内部
public class A{ class B{ B(){ System.out.println("Inner class B"); } } }A为外部类,B为内部类
每个内部类都自动拥有一个指向外部类实例的引用,使用 外部类名.this
eg:在class B 中,可以使用A.this,表示指向外部类的引用。
使用 OuterClassName.new 创建一个普通内部类实例
public class C{ public static void main(String[] args){ A a = new A(); A.B b = a.new B(); //B b = new B() 错误,无法找到B的类型 } } ly@HP:~/TIJ4/exercise$ javac C.java ly@HP:~/TIJ4/exercise$ java C Inner class B使用外部类实例方法创建一个内部类,然后返回内部类实例
public class Outer{ class Inner{ public Inner(){System.out.println("Outer.Inner");} } public Inner getInner(){ return new Inner(); } public static void main(String[] args){ Outer a = new Outer(); Inner b = a.getInner();//在外围类可以找到Inner类,因此不必声明为Outer.Inner } } ly@HP:~/TIJ4/exercise$ javac Outer.java ly@HP:~/TIJ4/exercise$ java Outer Outer.InnerNote:一个普通内部类(不添加static修饰符)的域和方法只能是实例类型,不能出现static的域和方法.
所以,想要创建一个普通内部类,必须创建一个外部类的声明
声明为static的内部类就是嵌套类
public class Outer{ static class Inner{ public Inner(){ System.out.println("static Inner"); } } public static void main(String[] args){ Inner a = new Inner();//直接调用Inner类的构造器 } } ly@HP:~/TIJ4/exercise$ javac Outer.java ly@HP:~/TIJ4/exercise$ java Outer static Inner如果在外部类外创建嵌套类
public class Test{ public static void main(String[] args){ Outer.Inner a = new Outer.Inner(); /*complier error: *Test.java:5: error: cannot find symbol * Outer.Inner a = Outer.new Inner(); * symbol: variable Outer * location: class Test * 1 error */ //Outer.Inner a = Outer.new Inner();//不能)将外部类名写在new前面,与普通内部类不一样 } } ly@HP:~/TIJ4/exercise$ javac Test.java ly@HP:~/TIJ4/exercise$ java Test static Inner1.普通内部类不能包含static数据和方法,而嵌套类不仅可以包含实例数据和方法,也可以包含static数据和方法
public class Outer{ class Inner{ /*complier error *Outer.java:3: error: Illegal static declaration in inner class Outer.Inner * static int i1 = 0; * ^ * modifier 'static' is only allowed in constant variable declarations *1 error */ //static int i1 = 0; int i2 = 1; public Inner(){ System.out.println("i2="+i2); } } static class Nest{ static int k1 = 2; int k2 = 3; public Nest(){ System.out.println("k1="+k1+" k2="+k2); } } public static void main(String[] args){ Outer a = new Outer(); Inner b = a.new Inner(); Nest c = new Nest(); } } ly@HP:~/TIJ4/exercise$ javac Outer.java ly@HP:~/TIJ4/exercise$ java Outer i2=1 k1=2 k2=32.普通内部类有指向外部类的实例的引用,而嵌套类没有(因为嵌套类的创建不需要外部类的实例)