Вы смотрели на сгенерированный байт-код и пытались отменить декомпиляцию обратно до java? Если вы не понимаете, как часто работает Kotlin, это может помочь вам понять.
В этом случае ваши классы в Java будут выглядеть следующим образом (я декомпилировал ваш код и очистил его little):
public class Car {
private int cost;
public int getCost() {
return this.cost;
}
public void setCost(int var1) {
this.cost = var1;
}
public Car(int c) {
this.cost = c;
System.out.println("This comes First " + getCost());
}
}
public class Vehicle extends Car {
private int cost = 20000;
public int getCost() {
return this.cost;
}
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());
}
}
То, что происходит, open var
- это просто объявление для установщика и получателя, которое Vehicle
переопределяет.
Помните, что инициализация суперкласса всегда происходит перед потомком, поэтому, когда Car
конструктор выполнен Vehicle
по-прежнему не инициализирован (Vehicle.cost
по-прежнему равен 0).
Это означает, что в первом случае:
This comes First 0 // Car constructor prints 0 because it returns Vehicle.cost which is unitialized
This comes Second 20000 // Vehicle constructor returns initialized value
cost = 20000
И во втором случае, когда вы не делаете 'T переопределяют стоимость, и Car
, и Vehicle
возвращают Car.cost
:
This comes First 1000 // Car constructor assigns constructor parameter to Car.cost and returns it
This comes Second 1000 // Vehicle constructor returns Car.cost as well
cost = 1000
Также обратите внимание, что в первом случае ваш параметр конструктора не имеет смысла: ему присваивается значение Car.cost
, но это поле недоступен, потому что затенен Vehicle.cost
.