如题,这篇博客就是围绕这个题目来展开的
可能很多人都觉得会输出 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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41class 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中隐藏与重写在向上转型时机制内容请搜索靠谱客的其他文章。
发表评论 取消回复