所以,我有这个问题(我猜这与动态绑定有关),我不能理解.

class A {
    public int m(A p) {
        return 12;
    }

    public int n(A p) {
        return 38;
    }
}
class B extends A {
    public int m(B p) {
        return 3;
    }

    public int n(A p) {
        return 7;
    }
}

class C extends A {
    public int m(A p) {
        return 38;
    }
    public int n(A p) {
        return 4;
    }
}
class D extends A {
    public int m(A p) {
        return 1;
    }

    public int n(D p) {
        return 2;
    }
}
class Main {
    public static void main(String argv[]) {
        A x = new C();
        A y = new D();
        D z = new D();
        System.out.println(x.m(z) + y.n(z)); //*
    }
}

注释行就是我被卡住的地方.为什么结果是76?这取决于什么,因为我在互联网上到处搜索,都找不到一个例子.如果你能想出一点解释,我将不胜感激.

推荐答案

它返回76,因为sum的两个部分都返回38:

x.m(z)此部分的意思是,try 在类A中找到方法m(因为xA),它可以接受D,there is no such method in 102,但有m接受A,只要DA扩展-使用这个方法,所以我们调用方法A.m(A),但是这个方法在C中被重写,所以被重写的方法实际上被执行,即C.m(A)

y.n(z)此部分遵循相同的逻辑并try 调用A.n(A),但类D不重写方法n-public int n(D p)不是A.n(A)的重写方法,因此执行A中的非重写方法

我建议你总是使用@Override annotation来允许编译器验证哪些方法实际上被重写,哪些没有,这里是注释版本,更容易遵循:

class A {
    public int m(A p) {return 12;}
    public int n(A p) {return 38;}
}
class B extends A {
    public int m(B p) {return 3;}
    @Override
    public int n(A p) {return 7;}
}
class C extends A {
    @Override
    public int m(A p) {return 38;}
    @Override
    public int n(A p) {return 4;}
}
class D extends A {
    @Override
    public int m(A p) {return 1;}
    public int n(D p) {return 2;}
}
class Main {
    public static void main(String argv[]) {
        A x = new C();
        A y = new D();
        D z = new D();
        System.out.println(x.m(z) + y.n(z)); //*
    }
}

要允许编译器找到n(D)方法,您必须将y强制转换为D,如((D)y).n(z)或在声明D y = new D();中使用派生类型

Java相关问答推荐

在FML中删除关键帧动画

无法传递消费者<;>;实例

Spring Boot Maven包

基于调车场算法的科学计算器

试着做一个2x2的魔方求解算法,我如何找到解路径(DFS)?

通过移动一个类解决了潜在的StubbingProblem.它怎麽工作?

如何从Keyloak映射Hibernate实体中的用户

MimeMessage emlMessage=new MimeMessage(Session,emlInputStream);抛出InvocationTargetException

如何获得凌空cookies ,并设置它在下一个请求- android

如何使这两种方法合二为一?

如何在ImageIO或十二只猴子中旋转TIFF CMYK图像?

Java 21中泛型的不兼容更改

判断重复的两个二维表算法?

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

如何修复Spring Boot应用程序中的RestDocumentationGenerationException:java.io.FileNotFoundException:/curl-request.adoc(只读文件系统)?

多线程、并发和睡眠未按预期工作

读取ConcurrentHashMap中的可变对象

MapStruct记录到记录的映射不起作用

在JSON上获取反斜杠

如何在 WebSphere Application Server 内的托管线程上运行 BatchEE 作业(job)?