java - `someObject.new` 在 Java 中做了什么?

标签 java

在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/

相关文章:

java - 如何在 WSO2 AS 5.2.1 上设置和部署 WebSocket?

Java - Encog 3.2 - RPROP网络不更新权重

java - Selenium Chrome 驱动程序选择证书弹出确认不起作用

java - java 15 的 h2o 构建失败

java - while循环中的异常处理

java - 我可以在 Java HttpSession 中存储整个图吗?

java - 提交后 MySQL 与 Hibernate JPA 错误 id

java - 为什么我的KeyAdapter总是落后一步?

Java Keystore.getKey() 缓慢,同时 key 存储大小增加

java - MongoDB 太多打开的连接