为什么Kotlin中的变量可以被覆盖,而Java中却不能?

问题描述 投票:0回答:1

在java中,变量不能被覆盖,只能被隐藏。而在 kotlin 中,我们可以覆盖变量。

虽然它们都运行在 JVM 上,但为什么会有这种差异呢? 是因为 kotlin 中的变量并未真正被覆盖,而只是默认的 getter 被覆盖吗?我的理解正确吗?

Kotlin 代码:

open class Animal {
    open var name: String = "Animal"
}

class Dog : Animal() {
    override var name: String = "Dog"
}

fun main() {
    val animal: Animal = Dog()
    println(animal.name) // Output: Dog
}

Java代码:

class Animal {
    String name = "Animal";
}

class Dog extends Animal {
    String name = "Dog";
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();
        System.out.println(animal.name); // Output: Animal
    }
}
java kotlin variables jvm overriding
1个回答
0
投票

原因是Java中的

String name = "Animal";
与Kotlin中的
open var name: String = "Animal"
不一样。这就是为什么前者的构造被称为field,而后者被称为property

默认情况下,Kotlin 中的非私有 var 属性实际上是 Java 级别上具有非私有 getter 和 setter 的私有字段(您可以在单击 Tools -> Kotlin -> Show Kotlin Bytecode 然后 后看到它)反编译,如下面截图)。

因此,您实际上覆盖了它的 getter 和 setter,而不是字段本身。如果您创建一个 Java

Cat
,您将只能重写相应的方法。

© www.soinside.com 2019 - 2024. All rights reserved.