gpt4 book ai didi

java - 为什么 kotlin 中的属性覆盖使主构造函数属性为零

转载 作者:行者123 更新时间:2023-12-01 14:04:56 25 4
gpt4 key购买 nike

我正在尝试将值传递给构造函数并打印值。

open class Car(c: Int){
open var cost: Int = c
init {
println("This comes First $cost")
}
}

open class Vehicle(cc: Int) : Car(cc) {
override var cost: Int = 20000
init {
println("This comes Second $cost")
}

fun show(){
println("cost = $cost")
}
}

fun main() {
var vehicle = Vehicle(1000)
vehicle.show()
}

输出
This comes First 0
This comes Second 20000
cost = 20000

如果我只是评论这一行 override var cost: Int = 20000
输出将是
This comes First 1000
This comes Second 1000
cost = 1000
  • 为什么在覆盖子类中的属性时 super 构造函数成本为零?
  • 我需要将其与 java 概念进行比较,以便在此处更好地解释
  • 最佳答案

    在Java中创建可变属性cost ,你需要定义一个字段成本和一个 getter 和 setter:

    public class Car {

    private int cost;

    public Car(int c) {
    this.cost = c;
    System.out.println("This comes First " + getCost());
    }

    public int getCost() { return cost; }

    public void setCost(int cost) { this.cost = cost; }
    }

    Kotlin 的语言中嵌入了属性的概念,因此您只需创建一个 var 属性即可实现相同的效果:
    open class Car(c : Int){
    open var cost : Int = c
    init {
    println("This comes First $cost")
    }
    }

    从开发人员的角度来看,这要简洁得多,但实现是相同的。 Kotlin 编译器在幕后为我们生成字段成本、get 方法和 set 方法。
    现在是有趣的部分。当您在父类中打开成本属性并在子类中覆盖它时,您实际上是在覆盖 get 方法。无论是在 Kotlin 还是 Java 中,都无法覆盖字段。

    正如@Pawel 在他的回答中提到的,这是 Vehicle 子类的 Java 代码:
    public class Vehicle extends Car {
    private int cost = 20000;

    @Override
    public int getCost() {
    return this.cost;
    }

    @Override
    public void setCost(int var1) {
    this.cost = var1;
    }

    public final void show() {
    System.out.println("cost = " + getCost());
    }

    public Vehicle(int cc) {
    super(cc);
    System.out.println("This comes Second " + getCost());
    }
    }

    当你执行 println("This comes First $cost")在父类中,您实际上是在执行 System.out.println("This comes First " + getCost());和实际 getCost()被调用的是子类 Vehicle 中的一个。由于子类成本字段尚未初始化,我们仍在执行 super(cc)调用,其值为零。

    关于java - 为什么 kotlin 中的属性覆盖使主构造函数属性为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61120904/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com