Может кто-нибудь объяснить мне, что здесь происходит и ПОЧЕМУ?Наследование и динамическое связывание
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 с сеттером, выход будет 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
Почему в случае № 1 (без геттера и сеттера в подклассе) setF (3) меняет как Base.f, так и Base2. е? – anastsiacrs
@anastsiacrs 'setF (3)' изменять только 'Base.f'. Getter и setter определяются только в классе «Base», поэтому, когда они выполняются, они получают/устанавливают значение «Base.f» varaible. «Base2.f» не изменяется, поэтому в случае №2 (где вы переопределяете метод getter) вы получаете «3 2 2 2' – lukaslew
case # 1: если setF (3) меняет только Base.f, то почему. f (в методе xx()) return 3? – anastsiacrs