//: DotThis.java
public class DotThis {
void f() {
System.out.println("DotThis.f()");
}
public class Inner {
public DotThis outer() {
return DotThis.this;
// A plain this would be Inner's this.
}
}
public Inner inner() {
return new Inner();
}
public static void main(String args[]) {
DotThis dt = new DotThis();
DotThis.Inner dti = dt.inner();
dti.outer().f();
}
} /** Output
DotThis.f()
*/
//: DotNew.java
public class DotNew {
public class Inner {}
public static void main(String args[]) {
DotNew dn = new DotNew();
DotNew.Inner dni = dn.new Inner();
}
}
//: DotNew.java
public class DotNew {
public class Inner {
public void f() {
System.out.println("DotNew.Inner.f()");
}
}
public static class StaticInner {
public void f() {
System.out.println("DotNew.StaticInner.f()");
}
}
public Inner f() {
return new Inner(); // 注意这里
}
public static void main(String args[]) {
DotNew dn = new DotNew();
DotNew.Inner dni = dn.new Inner();
dni.f();
//! Inner in = new Inner(); // Error: 无法从静态上下文中引用非静态 变量 this
//! Inner in = new DotNew.Inner(); // Error: 无法从静态上下文中引用非静态 变量 this
Inner in = dn.new Inner();
in.f();
Inner fin = dn.f();
fin.f();
// Inner in2 = new dn.Inner(); // Error: 程序包dn不存在
StaticInner si = new StaticInner();
si.f();
}
} /** Output
DotNew.Inner.f()
DotNew.Inner.f()
DotNew.Inner.f()
DotNew.StaticInner.f()
*/
//: Contents.java
public interface Contents {
int value();
}
//: Parcel7.java
// returning an instance of an anonymous inner class
public class Parcel7 {
public Contents contents() {
return new Contents() { // insert a class definition
private int i = 11;
public int value() { return i; }
}; // 这种情况下分号是必须的
}
public static void main(String args[]) {
Parcel7 p = new Parcel7();
Contents c = p.contents();
System.out.println(c.value());
}
} /** Output
11
*/
//: Parcel7b.java
public class Parcel7b {
class MyContents implements Contents {
private int i = 11;
public int value() { return i; }
}
public Contents contents() { return new MyContents(); }
public static void main(String args[]) {
Parcel7b p = new Parcel7b();
Contents c = p.contents();
System.out.println(c.value());
}
} /** Output
11
*/
如何在匿名内部类中向基类构造器传递参数:
//: Parcel8.java
public class Parcel8 {
public Wrapping wrapping(int x) {
// Base constructor call
return new Wrapping(x) { // pass Constructor argument
public int value() {
return super.value() * 47;
}
};
}
public static void main(String args[]) {
Parcel8 p = new Parcel8();
Wrapping w = p.wrapping(10);
System.out.println(w.value());
}
} /** Output
470
*/
class Wrapping {
private int i;
public Wrapping(int x) { i = x; }
public int value() { return i; }
}
//: InheritInner.java
class WithInner {
class Inner {}
}
public class InheritInner extends WithInner.Inner {
//! InheritInner() { } // Error: 需要包含WithInner.Inner的封闭实例
InheritInner(WithInner wi) {
wi.super();
}
public static void main(String args[]) {
WithInner wi = new WithInner();
InheritInner ii = new InheritInner(wi);
}
}