在Java中,我刚刚发现下面的代码是合法的:
KnockKnockServer newServer = new KnockKnockServer();
KnockKnockServer.receiver receive = newServer.new receiver(clientSocket);
仅供引用,receiver 只是一个具有以下签名的辅助类:
public class receiver extends Thread { /* code_inside */ }
我以前从未见过 XYZ.new
符号。这是如何运作的?有什么方法可以更传统地编码吗?
最佳答案
这是从包含类主体外部实例化非静态内部类的方法,如 Oracle docs 中所述。 .
每个内部类实例都与其包含类的一个实例相关联。当您从 within 其包含的类中 new
一个内部类时,它默认使用容器的 this
实例:
public class Foo {
int val;
public Foo(int v) { val = v; }
class Bar {
public void printVal() {
// this is the val belonging to our containing instance
System.out.println(val);
}
}
public Bar createBar() {
return new Bar(); // equivalent of this.new Bar()
}
}
但是如果你想在 Foo 之外创建一个 Bar 的实例,或者将一个新实例与一个包含的实例而不是 this
相关联,那么你必须使用前缀表示法。
Foo f = new Foo(5);
Foo.Bar b = f.new Bar();
b.printVal(); // prints 5
关于java - `someObject.new` 在 Java 中做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15724676/