有人可以解释一下这里发生的原因吗?

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/

10-10 13:35