在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中的
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
,您将只能重写相应的方法。