Почему s3() не использует x, объявленный в B?
Как правило, методы родительского класса не могут видеть переменные-члены в дочернем классе.
Я думаю, что делает именно это:
B b = new B();
b.f();
достаточно, чтобы воспроизвести по крайней мере часть вашего замешательства. Вот что е() выглядит в B:
class B extends A{
public int x = 5;
public void f(){
x = 10;
s3();
}
}
е() эквивалентно:
public void f(){
this.x = 10;
this.s3();
}
Так вызывающему б.F() означает, что F() эквивалентно:
public void f(){
b.x = 10;
b.s3();
}
Далее, что происходит внутри метода s3() в? s3() выглядит следующим образом:
public void s3(){
x = 3;
}
и что эквивалентно:
public void s3(){
this.x = 3;
}
«это» это объект, который вызвал метод, который из последнего примера F() вы можете увидеть это б. Так s3() эквивалентно:
public void s3(){
b.x = 3;
}
Так b.x получает перезаписаны с 3 ... uhhhhm не так быстро!
Экземпляр B также наследует й из А, это просто, что внутри Б бывает так, что Б х тень х от А. В результате, метод F() в B назначает й из B. Внутри s3(), однако, x, который получил от A, больше не затеняется, и что касается A, то существует только один x - тот, который принадлежит A. Другими словами, поиск bx принимает другое путь в зависимости от того, какой класс этот оператор появляется.
После выполнения s3() конечный результат состоит в том, что b имеет два x с двумя разными значениями. Внутренние методы в B, x из B будут видны, а внутри методов в A будет отображаться x из A. Внутри методов в B можно получить от x от A, используя super.
Теоретически, B не должен иметь свою собственную копию функции s3(), унаследованной от A?
Не думайте о копиях. Подумайте с точки зрения указателей от класса к классу и указателей от классов до поисковых таблиц. Обычно в компьютерном программировании каждый экземпляр имеет свои собственные переменные экземпляра, но методы разделяются всеми экземплярами класса.
Для дальнейшего использования использование отдельных символов в качестве имен для всех ваших переменных, методов и имен классов делает ваш код трудным для подражания. –
«Почему' s3() 'не использует' x', объявленный в 'B'?" Для этого 'B' должен переопределить' s3() ', который отличается от наследования. –