6.2 Java的内部类
再看一下Java的内部类:
public class OuterClass { public String outerClassName = "outerClass's name"; public void getNestedClassName() { String staticString = NestedStaticClass.staticString; //无法直接调用非静态内部类的变量 //String str = NestedClass.nestedClassName; } public NestedClass getNestedClass() { //可以直接new return new NestedClass(); } class NestedClass { public String nestedClassName = "nestedClass's name"; public void printOuterClassName() { //可以直接调用外部类的对象 System.out.println(outerClassName); } public OuterClass getOuter() { //返回外部类实例 return OuterClass.this; } } static class NestedStaticClass { public String nestedClassName = "NestedStaticClass's name"; public static String staticString = "staticString"; public void printOuterClassName() { //error 不可以直接调用外部类的对象 //System.out.println(outerClassName); } //error 无法返回外部类实例 // public OuterClass getOuter(){ // return OuterClass.this; // } } } class Test{ public static void main(String[] args) { //不允许直接通过new的方式创建OuterClass.NestedClass //OuterClass.NestedClass nestedClass1 = new OuterClass.NestedClass(); //只能通过外部类的实例创建内部类 OuterClass outerClass = new OuterClass(); //通过方法返回内部类实例 OuterClass.NestedClass nestedClass = outerClass.getNestedClass(); //通过.new关键字 OuterClass.NestedClass nestedClass1 = outerClass.new NestedClass(); //通过内部类实例获取外部类实例 System.out.println(nestedClass1.getOuter().outerClassName); nestedClass.printOuterClassName(); String staticString = OuterClass.NestedStaticClass.staticString; OuterClass.NestedStaticClass nestedStaticClass = new OuterClass.NestedStaticClass(); System.out.println(nestedStaticClass.nestedClassName); } }
可见,Java的内部类“玩法比较多,完全写来下可以说是一个比较大的专题了,简要列举一下与C#的内部类的不同之处。
6.3 非静态内部类总结
外部类都无法访问内部类的的方法和属性,但Java的内部类可以访问外部类的方法和属性,C#的不可以,Java内外部类互相访问提供了“.New”和“.this"关键字。
创建内部类,new的对象不同,C#通过“new 外部类.内部类() ”方式创建,Java不允许这样,需要外部类的实例,即:”外部类实例.new 内部类()“。
除了上述的内部类定义方式,Java的内部类可以出现在外部类的方法、语句块中。
6.4 静态内部类总结
C#的静态类中不允许有非静态方法和成员属性,Java的静态内部类中可以有。
C#和Java的内部类可以直接通过“外部类.内部类”的方式访问,具体要考虑内部类对应的访问修饰符。
C#的内部类不允许被new出新实例,Java的可以。
Java通过直接的方式访问内部类,只允许访问静态方法和成员属性。通过new的方式产生的实例,即可以访问静态成员也可以访问非静态成员。但不建议通过这种方式访问静态成员。
6.5 其他
Java还可以通过内部类的方式实现匿名类、多重继承等。
Java8之后,一些情形可以通过lamda简化内部类的写法。