-
Notifications
You must be signed in to change notification settings - Fork 30
/
Copy pathInnerClass.java
138 lines (109 loc) · 3.7 KB
/
InnerClass.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
class InnerClass {
private static final String staticField = "static field";
private final String finalField = "final field";
private String field = "field";
private String shadowed = "shadowed outer";
void f() { System.out.println("f"); }
class Inner extends InnerClass {
private final String innerField;
private final String shadowed = "shadowed inner";
Inner(String innerField) {
this.innerField = innerField;
}
@Override
void f() { System.out.println("override f"); }
void printFields() {
System.out.println();
System.out.println("printing fields");
System.out.println(innerField);
System.out.println(staticField);
System.out.println(finalField);
System.out.println(field);
System.out.println(shadowed);
System.out.println(Inner.super.shadowed);
System.out.println(InnerClass.this.shadowed);
field = "field already printed";
}
class InnerInner {
private final String innerInnerField = "inner inner field";
void printFields() {
Inner.this.printFields();
System.out.println(innerInnerField);
System.out.println("from inner: " + shadowed);
System.out.println("from inner: " + Inner.super.shadowed);
System.out.println("from inner: " + InnerClass.this.shadowed);
System.out.println("from inner: " + field);
Inner.super.f();
f();
}
}
}
class Strange extends Inner.InnerInner {
private final int field;
Strange(int field) {
InnerClass.this.new Inner("strange").super();
this.field = field;
}
void printFields() {
super.printFields();
System.out.println(field);
}
}
Inner createInner(final String param) {
final String localVar = "local var";
class Local extends Inner {
Local(String innerField) {
super(innerField);
}
@Override
void printFields() {
super.printFields();
System.out.println(localVar);
System.out.println(param);
}
}
return new Local("created by outer");
}
class Generic<T> {
T field;
Generic(T field) {
this.field = field;
}
class Inner {
T innerField;
Inner(T innerField) {
this.innerField = innerField;
}
void printFields() {
System.out.println();
System.out.println("printing fields");
System.out.println(field);
System.out.println(innerField);
}
}
}
public static void main(String[] args) {
InnerClass outer = new InnerClass();
Inner inner = outer.new Inner("created by main");
inner.printFields();
Inner innerFromOuter = outer.createInner("param");
innerFromOuter.printFields();
Inner.InnerInner innerInner = inner.new InnerInner();
innerInner.printFields();
new InnerClass().new Strange(42).printFields();
new InnerClass()
.new Generic<String>("generic")
.new Inner("generic inner")
.printFields();
new ExternalInner().printFields();
}
}
class ExternalInner extends InnerClass.Inner {
ExternalInner() {
new InnerClass().super("external sub");
}
@Override
void printFields() {
super.printFields();
}
}