Может кто-нибудь объяснить мне, что здесь происходит и ПОЧЕМУ?
class Base{
private float f = 1.0f;
void setF(float f1){ this.f = f1; }
float getF() {return f;}
public void xx(){}
}
class Base2 extends Base{
private float f = 2.0f;
public void xx(){
System.out.println(super.getF()+" "+this.getF());
}
//float getF() {return f;} //1
//void setF(float f1){ this.f = f1; } //2
public static void main(String[]args){
Base b=new Base2();
b.setF(3);
b.xx();
System.out.println(b.getF());
System.out.println(((Base)b).getF());
}
}
Вывод этого кода будет 3 3, 3, 3.
Если я раскомментирую только строку 1 с помощью геттера, вывод будет 3 2, 2, 2.
Если я раскомментирую только строку 2 с помощью setter, вывод будет 1 1, 1, 1.
Если я раскомментирую строки 1 и 2 (с сеттером и геттером), вывод будет 1 3, 3, 3.
//default output: 3 3, 3, 3
//with getter: 3 2, 2, 2
//with setter: 1 1, 1, 1
//with getter and setter: 1 3, 3, 3
Если переопределить метод в родительском классе кодом в подклассе, этот переопределенный метод не сможет получить доступ к закрытой переменной-члену, даже если переопределенный метод в родительском классе сделает это. Однако переопределяющий метод в подклассе может вызывать переопределенный метод в родительском.
Итак, это объясняет случай № 4 с геттером и сеттером, которые имеют доступ только к переменной-члену Base2.