Skip to content

Commit 1b93836

Browse files
authored
Merge pull request giantray#67 from troyliu0105/master
ADD: java-inner-class-and-static-nested-class.md
2 parents 1d7bcfa + 8cc8fe4 commit 1b93836

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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

Comments
 (0)