java 字段覆盖(field)

字段的覆盖

public class Father {
    public  String name="Father";
    public static void main(String[] args) {
        Son son=new Son();
        System.out.println(son.name);
        Father father=son;
        System.out.println(father.name);
    }
}
class Son extends Father{
    String name="Son";
}

此时两个输出分别为:

Son

Father

所以说,字段覆盖并不会导致父类的的那个字段没作用了,当子类实例向上转型为父类实例时,通过父类实例使用字段,调用的则是父类中的字段。

不仅仅是向上转型会这样,看下面这段代码:

public class Father {
    public  String name="Father";
    public void print(){
        System.out.println(name);
    }
    public static void main(String[] args) {
        Son son=new Son();
        son.print();
    }
}
class Son extends Father{
    String name="Son";
}

根据我的理解,可以这样解释:

Son继承了Father类,所以继承了print方法,但是,通过Son的实例调用print方法其实相当于

son.super.print();  其中super就是表示Father类的一个实例,该实例其实就是Son中的一个字段,即Father  super,只不过是隐藏的而已。

当Son的实例要调用print方法时,就是用super对象再调用print方法。

也就说,其实print方法不直接属于Son类,只不过当Son没有重写print方法时,都会去调用Father实例super的print方法。

所以,super对象调用print方法所能访问到的name字段自然也只能是super对象中的name字段。。

再通俗点说,super本身就是是Son中的一个字段,那么super又怎能直接访问Son中的其他字段呢?(除非把Son中其他字段传递进super中)。。

所以,super无法访问到Son中的name字段。不过,Son中是可以访问到super中的name字段的。。不过当Son中和super中同时存在一个同名的字段时,通过Son的实例自然是优先访问Son的字段。。。如果把Son实例向上转型为Father实例,此时转型后的实例访问同名字段会变成优先访问super中的字段。

以上是我对字段覆盖的简单猜测。。。就是我自己强行解释字段覆盖为什么那样。。

方法覆盖和字段覆盖是不一样的,不论怎样(父类方法调用被覆盖方法?向上转型?)所访问到的都是被覆盖后的方法。

猜你喜欢

转载自blog.csdn.net/qq_36951116/article/details/83621807