Kotlin 带内部类和外部类的括号是什么意思?

Kotlin 带内部类和外部类的括号是什么意思?,kotlin,static,inner-classes,parentheses,outer-classes,Kotlin,Static,Inner Classes,Parentheses,Outer Classes,为什么在print语句中没有带outer的括号,这是什么意思 class outer() { var name = "mr X" class nestedclass { var description = "Inside the nested class" var id = 101 fun foo() {

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

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

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

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

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

所以这句话:

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

(如果你了解Java,有两个很大的区别需要提及。首先,在Java中,内部类是默认的,你需要指定
static
使它们嵌套;但是在Kotlin中,嵌套类是默认的,有一个
internal
关键字。其次,Kotlin没有Java的
new
关键字来表示常量或者打电话,所以很难发现他们。)


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

这是不可编译的。你确定Outer没有声明为对象吗?@Tenfour04它在这里编译正常(一旦你注释掉
println()后面的注释
).没关系。我被小写的类名和在手机上阅读的内容吓坏了。当类不遵循Pascal大小写命名约定时,很难发现构造函数调用。@Tenfour04的确!我已经对此评论了很多次了……我们可以设置一个常见问题解答或一些基本编码约定、关于不必要的警告吗思考的使用,铸造和转化之间的区别,以及我们一直在说的其他事情?有时这是因为人们只是在使用了一种有不同习惯的语言之后才开始学习这种语言。