Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在kotlin中重写java类属性变量_Java_Kotlin_Inheritance_Overriding - Fatal编程技术网

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

如何在kotlin中重写java类属性变量,java,kotlin,inheritance,overriding,Java,Kotlin,Inheritance,Overriding,我试图在我的kotlin类中重写java属性变量,但一直出现错误“myVar不重写任何内容”。如何重写kotlin类的示例是,但它没有说明任何关于重写java属性的内容。代码如下: //Java public class myBaseClass{ protected String myVar = "hello"; public myBaseClass(){ } protected void myOneMethod(){ Sy

我试图在我的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)
    }
}

Java中的字段不能以任何方式重写。因为
myVar
是Java中的一个字段,所以不能在Kotlin中重写它。

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

公共类MyBaseClass{
私有字符串myVar=“hello”;
公共MyBaseClass(){
}
受保护的字符串getMyVar(){
返回myVar;
}
受保护的void setMyVar(字符串myVar){
this.myVar=myVar;
}
保护空位法(){
System.out.println(getMyVar());
}
}
class MyChildClass:MyBaseClass(){
私有变量重写了MyVar:字符串?=“嗨”
重写getMyVar():字符串{
返回重写的denmyvar
}
重写fun setMyVar(myVar:String?){
overridedenmyvar=myVar
}
}
fun main(){
val x:MyBaseClass=MyChildClass()
x、 myOneMethod()//打印“hi”
}
试着这样做:

//Kotlin
class KotlinImplementation: MyBaseClass() {
    init {
        myVar = "ji"
    }
}

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

    public MyBaseClass(){
    }

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

看起来是Java互操作中的一个问题

下面是一个解决方法:

  • 创建一个辅助Java类,隐藏有问题的
    受保护的
    字段:
  • 公共类myBaseClassKtInterop扩展了myBaseClass{
    私有字符串myVar;
    }
    
  • 在科特林扩展它;还考虑添加<代码> public < /代码>修改方法,覆盖<代码>保护<代码>一个(如果您不执行,方法<代码>受保护< /代码>;默认公共可见性在这种情况下不工作):
  • class myChildClass:myBaseClassKtInterop(){
    var myVar=“hi”
    公共方法(){
    println(myVar)
    }
    }
    
    现在,访问
    myVar
    的两种方法都起作用了:

    myChildClass().myOneMethod()//嗨
    println(myChildClass().myVar)//hi
    

    还请注意,如果有其他方法访问
    myBaseClass
    中的
    myVar
    ,则它们将使用
    “hello”
    值。考虑将它们全部重写,或者在<代码> MyBaseCass(如果可能的话)中改变<代码> MyVa< /Cult>可见性> <代码>私下<代码>,在这种情况下,您将不需要这个辅助类。

    考虑为<代码> MyVa<代码>创建一个吸气剂和设置器,仍然存在相同的错误: