0

为什么在 print 语句中没有带外括号的括号,这是什么意思?

    class outer() {
        var name = "mr X"
    
        class nestedclass {
            var description = "Inside the nested class"
            var id = 101
            fun foo() {
                println("id is $id")
    
            }
        }
    }
    
    fun main() {
        println(outer.nestedclass().description)  why there is no () with outer?
        outer.nestedclass().foo()
        var obj = outer.nestedclass()
        obj.foo()
        println(obj.description)
    }
4

1 回答 1

1

没有括号,因为它没有创建outer.

如果nestedclass内部类,那么每个实例都将与 的实例相关联outer,因此您需要在前者之前构造后者。(你可以通过添加括号来做到这一点,如outer().nestedclass()。)

但它只是一个嵌套类——在 的词法范围内定义outer,但与实例无关。简单来说就是outer.nestedclass类名,你可以直接调用它的构造函数为outer.nestedclass().

所以这一行:

println(outer.nestedclass().description)

构造 的实例outer.nestedclass,获取其description属性的值,并将其打印出来。

(如果你懂 Java,这里有两个很大的区别。首先,在 Java 中内部类是默认的,你需要指定static使其嵌套;但在 Kotlin 中,嵌套类是默认的,并且有一个inner关键字。和其次,Kotlin 没有 Java 的new关键字来指示构造函数调用,因此很难发现它们。)

(另外,正如 Tenfour04 所说,通常以大写字母 AKA PascalCase 开头类名。这使它们更容易与方法名称和其他标识符区分开来——这些标识符通常以驼峰形式出现。这个问题是一种情况,其中额外的清晰会有所帮助。)

于 2020-11-17T18:53:53.990 回答