有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在多级继承中调用方法的哪个版本?

情况:假设我有一个类a、一个扩展了a的类B和一个扩展了B的类C。类a有一个方法hello(),它在类B中被重写

事件:现在C类调用hello()

问题:将调用哪个版本?我猜它将属于层次结构中正上方的类,即B。在任何情况下,如何从C访问hello()的不同版本

相关问题:通过使用super,我们可以访问层次结构中正上方的版本,但如何访问层次结构中更高的版本?例如,如何从C访问A的hello()


共 (3) 个答案

  1. # 1 楼答案

    不能。只有B中的代码才能使用super调用A.hello();如果A、B和C都要实现hello(),那么C中的任何代码都不可能访问A.hello()

    一般来说,任何类中的代码都可以调用它自己的方法版本,以及它的直接超类的版本,就是这样。如果没有超类的合作,就无法调用任何其他对象

  2. # 2 楼答案

    动态方法调度 动态方法分派是一种机制,通过这种机制,在运行时而不是编译时解析对重写方法的调用。动态方法分派很重要,因为这是Java实现运行时多态性的方式。 超类引用变量可以引用子类对象。Java使用这个事实在运行时解析对重写方法的调用。这里是如何。当通过超类引用调用重写的方法时,Java会根据调用时引用的对象的类型确定要执行该方法的哪个版本。因此,该确定是在运行时进行的。当引用不同类型的对象时,将调用重写方法的不同版本。换句话说,正是被引用对象的类型(而不是引用变量的类型)决定了将执行哪个版本的重写方法。因此,如果超类包含被子类重写的方法,那么当通过超类引用变量引用不同类型的对象时,将执行该方法的不同版本

    例如: 甲级

    {

    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();
    
    }
    

    }

  3. # 3 楼答案

    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方法