【问题标题】:I do not understand the compiling order in this sequence of code [duplicate]我不明白这个代码序列中的编译顺序[重复]
【发布时间】:2019-01-16 10:02:06
【问题描述】:

我很难理解为什么在标有“////1”的行,程序将返回 62 而不是 34。 谁能一步一步解释?我是java初学者,我正在努力理解执行顺序。

class X {
        public void proc(X p){
            System.out.println(12);
        }
}

class Y extends X{
    public void proc(X p){
        System.out.println(62);
    }
}

class Z extends Y{
    public void proc(Z p){
        System.out.println(34);
    }
}

class Main4{
    public static void main(String[] args){
        X x = new Z();
        Y y = new Z();
        Z z = new Z();
        x.proc(z);////1
    }
}

任何帮助都会很棒!谢谢!

【问题讨论】:

  • proc(Z) 不会覆盖proc(X)

标签: java


【解决方案1】:

x.proc(z) 在编译时从x 类型(即X)中选择方法。唯一可用的方法是proc(X)

还请记住,Z 中的 public void proc(Z p) 不会覆盖 public void proc(X p)

【讨论】:

    【解决方案2】:

    您得到此结果是因为您的 proc 方法不会相互覆盖。

    查看此内容的最简单方法是添加@Override-annotation:

    static class Z extends Y {
        public Z() {
            v += 9;
        }
    
        @Override
        public void proc(Z p) {
            System.out.println(34);
        }
    }
    

    这将无法编译并显示错误消息

    Test.Z 类型的方法 proc(Test.Z) 必须覆盖或实现超类型方法

    当你打算重写一个方法时添加这个注解是个好主意——这样编译器可以检查你是否真的这样做了。

    要修复错误并重写方法以获得预期的输出,您可以将参数的类型更改为X

    static class Z extends Y {
        public Z() {
            v += 9;
        }
    
        @Override
        public void proc(X p) {
            System.out.println(34);
        }
    }
    

    现在它再次编译,并产生34


    在您的示例中发生的情况是,您的类 Z 添加了一个重载方法 void proc(Z p) 到来自 Xvoid proc(X p) 方法,而不是覆盖。重载解决方案基于编译时类型,因此只有X 中的方法可用并被选择。这个方法在Y 中被覆盖,所以这就是在运行时实际执行的。

    因此,获得预期结果的另一种方法是保持XYZ 不变,并将x 的引用类型更改为Z

    public static void main(String[] args) {
        Z x = new Z();
        Y y = new Z();
        Z z = new Z();
        x.proc(z);//// 1
        System.out.println(y.getV());
    }
    

    此版本调用Z 中的重载 方法,因为它是Z 类型参数的最具体重载。

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多