首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法理解Java代码段输出,可能与多态性有关

无法理解Java代码段输出,可能与多态性有关
EN

Stack Overflow用户
提问于 2013-05-02 04:20:33
回答 2查看 114关注 0票数 4

我想知道为什么这段Java代码会产生2,而不是3:

代码语言:javascript
复制
public class Test {
    private static class A {
        int f(A a) {
            return 1;
        }
    }
    private static class B extends A {
        int f(A a) {
            return 2;
        }
        int f(B b) {
            return 3;
        }
    }

    public static void main(String[] astrArgs) {
        A ab = new B();
        B b = new B();

        System.out.println( ab.f(b) );  
    }
}

我在一道测试题中遇到了这个问题,并且无法理解它背后的逻辑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-02 04:23:55

ab的编译时类型就是A。因此,当编译器看到这个表达式时:

代码语言:javascript
复制
ab.f(b)

..。它只考虑在A及其超类(本例中只有Object )上声明的方法签名。

因此,编译器决定使用签名f(A a)调用该方法。

现在,在执行时,VM根据方法调用目标的执行时类型(即B )来选择要执行该签名的哪个实现。

B重写f(A a),因此重写实现被调用-并返回2。

基本上,重载是在编译时确定的,以根据调用目标和参数的编译时类型确定要调用的方法签名,而重载是在执行时确定的,以根据目标对象的执行时类型确定要执行的确切实现。

票数 8
EN

Stack Overflow用户

发布于 2013-05-02 04:43:13

在本例中,ab是A类型,但实例化为B。A只知道方法

代码语言:javascript
复制
int f(A a) {
  return 1;
}

B是A类型,所以它是有效的。B覆盖int f(A a),因此使用此方法。

代码语言:javascript
复制
int f(A a) {
    return 2;
}

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16325823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档