如何在 kotlin 中重写 java 类属性变量

Jis*_*soo 1 java inheritance overriding kotlin

我试图覆盖 kotlin 类中的 java 属性变量,但不断收到错误“myVar 不覆盖任何内容”。这里有如何重写 kotlin 类的示例,但它没有说明有关重写 java 属性的任何内容。这是代码:

//Java
public class myBaseClass{
    protected String myVar = "hello";

    public myBaseClass(){
    }

    protected void myOneMethod(){
        System.out.println(myVar);
    }
}


//Kotlin
class myChildClass() : myBaseClass() {
    override var myVar = "hi"

    override fun myOneMethod()
    {
        System.out.println(myVar)
    }
}
Run Code Online (Sandbox Code Playgroud)

Ten*_*r04 5

由于 Java 没有属性,因此您需要将字段设为私有并提供 getter 和 setter。然后在 Kotlin 中,您可以重写 getter 和 setter。这并不漂亮,但这也是您在 Java 子类中必须这样做的方式。您需要另一个私有属性来为子类实现创建新的支持字段。

public class MyBaseClass {
    private String myVar = "hello";

    public MyBaseClass(){
    }

    protected String getMyVar() {
        return myVar;
    }

    protected void setMyVar(String myVar) {
        this.myVar = myVar;
    }

    protected void myOneMethod(){
        System.out.println(getMyVar());
    }
}
Run Code Online (Sandbox Code Playgroud)
class MyChildClass : MyBaseClass() {
    private var overriddenMyVar: String? = "hi"

    override fun getMyVar(): String? {
        return overriddenMyVar
    }

    override fun setMyVar(myVar: String?) {
        overriddenMyVar = myVar
    }
}
Run Code Online (Sandbox Code Playgroud)
fun main() {
    val x : MyBaseClass = MyChildClass()
    x.myOneMethod() // Prints "hi"
}
Run Code Online (Sandbox Code Playgroud)