java重写⽅法调⽤优先级_多态中,⽅法的调⽤优先级
以前对java中多态的理解只停留在重写Overriding和重载Overloading上,但是对于经过重写,重载的⽅法的调⽤顺序,尤其涉及⽗类对象以⼦类实例化,⼜或者经过向上向下转型后,经过重写的⽅法调⽤的优先级往往会使⼈混乱。。例如:
class A {
public String show(final A obj) {
return ("A and A");
}
}
class B extends A {
public String show(final B obj) {
return ("B and B");
}
@Override
public String show(final A obj) {
return ("B and A");
}
}
final A a2 = new B();
final B b = new B();
System.out.println(a2.show(b));
输出的结果为:B and A
对此,在⽹上看到⼀条准则:当超类对象引⽤变量引⽤⼦类对象时,被引⽤对象的类型⽽不是引⽤变
量的类型决定了调⽤谁的成员⽅法,但是这个被调⽤的⽅法必须是在超类中定义过的,也就是说被⼦类覆盖的⽅法。
java重写和重载的区别实际上这⾥涉及⽅法调⽤的优先问题 ,优先级由⾼到低依次为:this.show(O)、super.show(O)、this.show((super)O)、
super.show((super)O)。以此准则,推算下结果的思路。
a2是⼀个引⽤变量,类型为A,它引⽤的是B的⼀个对象。记得在core java中有过这么⼀个定论:⼀个对象有哪些⽅法,是由声明的类型决定,⽽不是实例化的类型决定,这个没有疑问,⽤eclipse看a2的⽅法确实只看到show(A obj),并没有show(B obj)。再结合上⾯说的顺序,this为a2,于是它到类A⾥⾯show(B obj)⽅法,没有到,于是到A的super(超类),⽽A没有超类,因此转到第三优先级
this.show((super)O),(super)O即(super)B即A,因此它到类A⾥⾯show(A obj)的⽅法,类A有这个⽅法,但是,按照红字的准则,调⽤谁的成员⽅法是由被引⽤对象的类型来决定,由于a2引⽤的是类B的⼀个对象,B覆盖了A的show(A obj)⽅法,因此最终锁定到类B的show(A obj),输出为"B and A”。
当然,另⼀种思路可以直接按照准则去,a2是⼀个引⽤变量,类型为A,它引⽤的是B的⼀个对象,因此这句话的意思是由B来决定调⽤的是哪个⽅法。因此应该调⽤B的show(B obj)从⽽输出"B and B”
才对。但是请注意红字的后半部分,这个被调⽤的⽅法必须是在超类中定义过的,也就是说被⼦类覆盖的⽅法。B⾥⾯的show(B obj)在超类A中有定义吗?没有!那就更谈不上被覆盖了。它在类A中到了show(A obj),如果⼦类B没有覆盖show(A obj)⽅法,那么它就调⽤A的show(A obj)(由于B继承A,虽然没有覆盖这个⽅法,但从超类A 那⾥继承了这个⽅法,从某种意义上说,还是由B确定调⽤的⽅法,只是⽅法是在A中实现⽽已)。现在⼦类B覆盖了show(A obj),因此它最终锁定到B的show(A obj),所以输出"B and A”。
以下参考题⽬来源于⽹络:
(⼀)相关类
public String show(D obj)...{
return ("A and D");
}
public String show(A obj)...{
return ("A and A");
}
}
class B {
public String show(B obj)...{
return ("B and B");
}
public String show(A obj)...{
return ("B and A");
}
}
class C {}
class D {}
(⼆)问题:以下输出结果是什么?
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); ①System.out.println(a1.show(c)); ②System.out.println(a1.show(d)); ③System.out.println(a2.show(b)); ④System.out.println(a2.show(c)); ⑤System.out.println(a2.show(d)); ⑥System.out.println(b.show(b)); ⑦System.out.println(b.show(c)); ⑧System.out.println(b.show(d)); ⑨(三)答案
② A and A
③ A and D
④ B and A
⑤ B and A
⑥ A and D
⑦ B and B
⑧ B and B
⑨ A and D
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论