|
| 1 | +## Java内部类和嵌套静态类 |
| 2 | + |
| 3 | +### 问题 |
| 4 | +Java 当中的内部类和静态嵌套类有什么主要区别? 在这两者中有什么设计或者实现么? |
| 5 | + |
| 6 | +### 回答 |
| 7 | +嵌套类分为两类: 静态和非静态. 用`static`装饰的嵌套类叫做静态类, 非静态的嵌套类叫做内部类. |
| 8 | + |
| 9 | +静态嵌套类使用外围类名来访问: |
| 10 | +```java |
| 11 | +OuterClass.StaticNestedClass |
| 12 | +``` |
| 13 | +例如, 实例化一个静态嵌套类的对象就要使用这种语法: |
| 14 | +```java |
| 15 | +OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); |
| 16 | +``` |
| 17 | + |
| 18 | +内部类对象的存在需要依靠一个外部类的对象. 看看下面的类: |
| 19 | +```java |
| 20 | +class OuterClass { |
| 21 | + ... |
| 22 | + class InnerClass { |
| 23 | + ... |
| 24 | + } |
| 25 | +} |
| 26 | +``` |
| 27 | +内部类对象只有当外部类对象存在时才有效, 并且可以直接访问他的包裹对象(外部类对象)的方法以及成员. |
| 28 | + |
| 29 | +因此, 要实例化一个内部类对象, 必须先实例化外部类对象. 然后用这种语法来创建内部类对象: |
| 30 | +```java |
| 31 | +OuterClass.InnerClass innerObject = outerObject.new InnerClass(); |
| 32 | +``` |
| 33 | +参考: [Java Tutorial - Nested Classes](http://download.oracle.com/javase/tutorial/java/javaOO/nested.html) |
| 34 | + |
| 35 | +提醒一下, 还有一种不用外部类对象来创建内部类对象的方法: [inner class without an enclosing ](http://stackoverflow.com/questions/20468856/is-it-true-that-every-inner-class-requires-an-enclosing-instance) |
| 36 | +```java |
| 37 | +class A { |
| 38 | + int t() { return 1; } |
| 39 | + static A a = new A() { int t() { return 2; } }; |
| 40 | +} |
| 41 | +``` |
| 42 | +在这里, `new A() { ... }`是一个定义在静态上下文的内部类对象, 并没有一个外围对象. |
| 43 | + |
| 44 | +stackoverflow链接: [Java inner class and static nested class](http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class) |
0 commit comments