状态:假设我有一个A类,一个扩展A的类B和一个扩展B的类C,C类A有一个方法hello(),它在B类中被重写。
EVENT:现在C类调用hello()。
问题:将调用哪个版本?我猜它将是层次结构中上面的类,即B.无论如何,如何从中访问不同版本的hello() C?
相关问题:通过使用super,我们可以在层次结构中访问上面的版本但是如何访问层次结构中较高的版本?例如,如何从C?
访问A的hello()答案 0 :(得分:2)
你做不到。只有B
中的代码才能使用super
来调用A.hello()
;如果A,B和C全部实现hello()
,则C中的任何代码都不可能访问A.hello()
。
通常,任何类中的代码都可以调用自己的方法版本,以及它的直接超类的版本,就是这样。没有超类的合作,就没有办法打电话给任何其他人。
答案 1 :(得分:0)
动态方法调度 动态方法调度是在运行时解析对重写方法的调用而不是编译时的机制。动态方法调度很重要,因为这是Java实现运行时多态的方式。 超类引用变量可以引用子类对象。 Java使用此事实来解析在运行时对重写方法的调用。这是怎么回事。当通过超类引用调用重写方法时,Java根据调用发生时引用的对象类型确定要执行该方法的哪个版本。因此,该确定在运行时进行。当引用不同类型的对象时,将调用被覆盖方法的不同版本。换句话说,它是被引用的对象的类型(不是引用变量的类型),它确定将执行被覆盖方法的哪个版本。因此,如果超类包含被子类覆盖的方法,则当通过超类引用变量引用不同类型的对象时,将执行该方法的不同版本。
实施例: A级
{
int a;
void show()
{
a=10;
System.out.println("a of A : "+a);
}
}
B类延伸A
{
int a;
void show()
{
a=20;
System.out.println("a of B : "+a);
}
}
C类延伸B
{
int a;
void show()
{
a=30;
System.out.println("a of C : "+a);
}
}
类歧义
{
public static void main(String args[])
{
A oa = new A();
B ob = new B();
C oc = new C();
A r;//r is superclass reference variable
r = oa;
r.show();
r = ob;
r.show();
r = oc;
r.show();
}
}
答案 2 :(得分:0)
class Abcd{
public void show() {
System.out.println("ABCS");
}
}
class Pqr extends Abcd{
public void show() {
System.out.println("PQR");
}
}
class Xyy extends Pqr{
public void show() {
System.out.println("XYY");
}
}
public class SuperKey {
public static void main(String args[]) {
Xyy xy=new Xyy();
xy.show();
}
}
如何从Xyy show方法调用Abcd show方法?