有人可以解释一下这里发生的原因吗?
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。
如果我只用getter取消注释第1行,输出将是3 2、2、2。
如果我仅用setter取消注释第2行,则输出将为1 1、1、1。
如果取消注释第1行和第2行(带有setter和getter),则输出将为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
如果用子类中的代码覆盖父类中的方法,则即使父类中的重写方法可以访问该私有方法,该重写方法也无法访问私有成员变量。但是,子类中的重写方法可以在父类中调用重写方法。
因此,这是解释同时具有getter和setter的情况#4,它们只能访问Base2成员变量
最佳答案
之所以得到3 3 3 3
,是因为set / get方法修改了Base.f
变量:
之所以得到3 2 2 2
,是因为设置了Base.f
变量的更改值,但是get方法获得了Base2.f
变量的值。
之所以得到1 1 1 1
,是因为set方法更改了Base2.f
变量的值,但是get方法获得了Base.f
变量的值。
之所以得到1 3 3 3
,是因为super.getF()
返回Base.f
变量的值,而其他get方法返回Base2.f
变量的值。还要设置Base2.f
变量的方法更改值。
关于java - 继承与动态绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31609345/