关于Java中隐藏与重写在向上转型时机制

如题,这篇博客就是围绕这个题目来展开的

可能很多人都觉得会输出 ABbbbb ,其实并不是这样(如果你知道正确答案怎么来的,就不必看了)在这里插入图片描述


隐藏与重写:

隐藏是相对于 父类的成员变量和静态方法而言的,就是说只有 成员和静态方法会被隐藏
那么声明变量之后就会有这样的结果,对象a中有一个s=“A” ,但是对象b中有两个s一个本身的"B" 还有一个继承自父类的"A"
证明可以在B类中定义一个public String getSS(){ return super.s; } 方法
然后执行System.out.println(b.getSS()); 结果返回’A’
没有隐藏的 成员方法 就被重写了
这里就是指getS()方法和setS()方法,它们被重写了


向上转型:

执行 a=b 就是一个向上转型的过程,这里比较神奇
转型之后父类 先找子类继承于父类的 成员有就用,没有就找子类中同名成员
执行之后a指向了b对象中隐藏的a中的成员,即a.s现在等于b中的隐藏变量 "A"

这就是输出A的原因~


如果不清楚倒数第二个为什么输出b

我的解释:getS()不是被覆盖了吗,a中的getS()用的是B类中的方法,所以this.s也是B类中的s 即"B"
如果不信调用的是B类的getS() 也可以手动尝试 如下
最后输出的是两个4 因为调用的都是B类的getS()

class A{
    public String s="A";
    public void setS(String s){
        this.s=s;
        System.out.println(1);
    }
    public String getS(){
        System.out.println(2);
        return s;

    }
}
public class Main extends A{
    public String s="B";
    public void setS(String s){
        System.out.println(3);
        this.s=s;
    }
    public String getS(){
        System.out.println(4);
        return s;
    }
    public String getSS(){
        return super.s;
    }
    public static void main(String args[]){
        A a=new A();
        Main b=new Main();
        System.out.println(a.s);
        System.out.println(b.s);
        System.out.println(b.getSS());    //输出A说明 有一个父类的String被隐藏
        a.setS("a");
        b.setS("b");
        a=b;
        System.out.println(a.s);
        System.out.println(b.s);
        System.out.println(a.getS());
        System.out.println(b.getS());
    }
}

初学者 可能有错误 望大佬指出 ~
参考博客:https://blog.csdn.net/jhk111/article/details/78558429

发布了71 篇原创文章 · 获赞 89 · 访问量 8537

猜你喜欢

转载自blog.csdn.net/weixin_43890662/article/details/103061059