2、成员内部类:形式如下class Outer { class Inner{} }编译上述代码会产生两个文件:Outer.class和Outer$Inner.class.成员内部类内不允许有任何静态声明!下面代码不能通过编译。
class Inner{ static int a = 10;}能够访问成员内部类的唯一途径就是通过外部类的对象!
A、从外部类的非静态方法中实例化内部类对象。
class Outer { private int i = 10;public void makeInner(){ Inner in = new Inner();in.seeOuter();} class Inner{ public void seeOuter(){ System.out.print(i);}表面上,我们并没有创建外部类的对象就实例化了内部类对象,和上面的话矛盾。事实上,如果不创建外部类对象也就不可能调用makeInner()方法,所以到头来还是要创建外部类对象的。
你可能试图把makeInner()方法修饰为静态方法,即static public void makeInner()。这样不创建外部类就可以实例化外部类了!但是在一个静态方法里能访问非静态成员和方法吗?显然不能。它没有this引用。没能跳出那条规则!但是如果在这个静态方法中实例化一个外部类对象,再用这个对象实例化外部类呢?完全可以!也就是下一条的内容。
B、从外部类的静态方法中实例化内部类对象。
class Outer { private int i = 10;class Inner{ public void seeOuter(){ System.out.print(i);} public static void main(String[] args) { Outer out = new Outer();Outer.Inner in = out.new Inner();//Outer.Inner in = new Outer()。new Inner();in.seeOuter();}被注释掉的那行是它上面两行的合并形式,一条简洁的语句。
对比一下:在外部类的非静态方法中实例化内部类对象是普通的new方式:Inner in = new Inner();在外部类的静态方法中实例化内部类对象,必须先创建外部类对象:Outer.Inner in = new Outer()。new Inner();C、内部类的this引用。
普通的类可以用this引用当前的对象,内部类也是如此。但是假若内部类想引用外部类当前的对象呢?用“外部类名”。this;的形式,如下例的Outer.this. class Outer { class Inner{ public void seeOuter(){ System.out.println(this);System.out.println(Outer.this);} D、成员内部类的修饰符。
下面是完整的例子:class Outer { public void doSomething(){ final int a =10;class Inner{ public void seeOuter(){ System.out.println(a);} Inner in = new Inner();in.seeOuter();} public static void main(String[] args) { Outer out = new Outer();out.doSomething();} C、方法内部类的修饰符。
class Car { public void drive(){ System.out.println("Driving a car!");} class Test{ public static void main(String[] args) { Car car = new Car(){ public void drive(){ System.out.println("Driving another car!");} };car.drive();}结果输出了:Driving another car! Car引用变量不是引用Car对象,而是Car匿名子类的对象。
interface Vehicle { public void drive();} class Test{ public static void main(String[] args) { Vehicle v = new Vehicle(){ public void drive(){ System.out.println("Driving a car!");} };v.drive();}上面的代码很怪,好像是在实例化一个接口。事实并非如此,接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。
C、参数式的匿名内部类。
class Bar{ void doStuff(Foo f){} } interface Foo{ void foo();} class Test{ static void go(){ Bar b = new Bar();b.doStuff(new Foo(){ public void foo(){ System.out.println("foofy");} });} 5、静态嵌套类。