为什么打印语句中没有带外部的括号,这是什么意思?
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中。这个问题是一种额外清晰会有所帮助的情况。(