【问题标题】:Syntax for 'new' in java [duplicate]java中'new'的语法[重复]
【发布时间】:2015-12-04 07:07:21
【问题描述】:

非静态成员类的构造函数采用一个额外的隐藏参数,它是对直接封闭类的实例的引用。还有一个“新”的句法扩展。

在下面的代码中,

class K{
    static class Ka{
        static class Kb{
            class Kc{
                class Kd{

                }
            }
        }
    }
}

class Test{
    K.Ka.Kb.Kc.Kd k = new K.Ka.Kb().new Kc().new Kd();
}

你能帮我理解Kb()K.Ka.Kb().new Kc().new Kd()中的含义吗?我知道new Kc() 是必需的,如第一段所述。

【问题讨论】:

  • 仅当您阅读this时才考虑

标签: java inner-classes nested-class


【解决方案1】:

您指出的括号实际上不适用于Kb,而是K.Ka.Kb

new K.Ka.Kb()

正在创建 K.Ka.Kb 嵌套类的新实例。

【讨论】:

  • 哦,你是说(new K.Ka.Kb()).new Kc().new Kd();
  • @SotiriosDelimanolis kckd 是内部类。但是将非静态成员类称为内部类的成语,是标准的行话吗?
  • Yes
【解决方案2】:

它正在调用Kb 的构造函数。用三个语句更容易表明这一点:

K.Ka.Kb x1 = new K.Ka.Kb();
K.Ka.Kb.Kc x2 = x1.new Kc(); // Pass x1 as the hidden constructor arg
K.Ka.Kb.Kd.Kd k = x2.new Kd(); // Pass x2 as the hidden constructor arg

【讨论】:

    【解决方案3】:

    Kb() 是类Kb 的默认构造函数。这与该行的第一个 new 有关:

    1. 您正在创建Kb 的新实例(实际上是K.Ka.Kb 类;根据上下文,您可以省略K.Ka.
    2. 您正在调用 new Kc() 以创建 Kc 的新实例
    3. 您正在调用 new Kd() 以创建 Kd 的新实例

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多