В следующем коде, я не понимаю, почему, когда a1.k()
называется, this.x
в классе C
возвращается 100 вместо 1. Я понимаю, что this
относится к текущему объекту, но статический тип текущей переменной a1
является A
. Так не должно this.x
возвращает 1, что является переменной для типа A? Я имею в виду a1.x
должен вернуть 1
, правильно? Большое спасибо!подкласс и ключевое слово это в Java
class A {
public int x = 1;
public String k() { return "A" + this.x; }
}
class B extends A {
public int x = 10;
...
}
class C extends B {
public int x = 100;
public String k() { return "C" + this.x; }
}
class TestABC {
public static void main(String[] args) {
A a1 = new C();
C c1 = new C();
System.out.println(a1.k());
}
}
Нет такой вещи, как статический тип объекта. То, о чем вы говорите, это статический тип переменной или просто тип выражения. –
'a1' не должен иметь метод' k() ', во время компиляции его тип' A' правильный? Также 'x' из класса' C', вероятно, переопределяет 'x' как из' A', так и 'B'. –
Извините, ребята, да, я имею в виду, что статический тип переменной a1 равен A. Также я редактировал вопрос, изначально я оставил метод k() в классе A. Итак, да k() в классе C переопределяет суперкласс k (). Но меня смущает то, что почему a1.k() возвращает 100, когда статический тип a1 равен A. – user3735871