Java中“new”的语法

7

非静态成员类的构造函数会多一个隐藏参数,它是对立即包围该成员类的实例的引用。此外,“new”还有一种语法扩展。

在以下代码中,

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();
}

您能帮我理解 K.Ka.Kb().new Kc().new Kd() 中的 Kb() 吗?我知道第一段中说需要 new Kc()


1
只有当你认真阅读了这个链接(https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)时,才需要进行下一步操作。 - QuakeCore
3个回答

7
你指出的括号实际上并不适用于 Kb,而是适用于 K.Ka.Kb
new K.Ka.Kb()

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


3
你的意思是(new K.Ka.Kb()).new Kc().new Kd();吗? - overexchange
@SotiriosDelimanolis kckd 是内部类。但是将非静态成员类称为“内部类”的说法,这是否是一个标准行话? - overexchange
2
Yes - Sotirios Delimanolis

3

它正在调用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

1

Kb() 是类 Kb 的默认构造函数。它与行中的第一个 new 相关:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接