概述
如题,这篇博客就是围绕这个题目来展开的
可能很多人都觉得会输出 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
最后
以上就是谦让书本为你收集整理的关于Java中隐藏与重写在向上转型时机制的全部内容,希望文章能够帮你解决关于Java中隐藏与重写在向上转型时机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复