带有内部类和外部类的括号的含义是什么



为什么打印语句中没有带外部的括号,这是什么意思?

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

没有parens,因为它没有创建outer的实例。

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

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

所以这条线:

println(outer.nestedclass().description)

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

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

(此外,正如Tenfour04所说,类名通常以大写字母开头,也就是PascalCase。这使得它们更容易与方法名和其他标识符区分开来,而方法名和标识符通常在camelCase中。这个问题是一种额外清晰会有所帮助的情况。(

相关内容

  • 没有找到相关文章

最新更新