【问题标题】:Why the Overrided function getting called first?为什么首先调用 Overrided 函数?
【发布时间】:2016-03-01 15:48:14
【问题描述】:

我执行了以下程序,我很好奇我得到的输出是函数输出首先被打印出来的,即使它是我首先尝试打印的变量。

class Baap{

    public int h = 4;
    public int getH(){
        System.out.println("Baap "+h); return h;
    }

}

public class Beta extends Baap{

    public int h = 44;
    public int getH(){
        System.out.println("Beta "+h); return h;
    }
    public static void main(String args[]){
        Baap b = new Beta();
        System.out.println(b.h+" "+b.getH());
        Beta bb = (Beta)b;
        System.out.println(bb.h+" "+bb.getH());
    }

}

输出如下

Beta 44
4 44
Beta 44
44 44

谁能帮我理解为什么功能块首先被执行?

【问题讨论】:

  • @Nambari,他指的不是这个。

标签: java inheritance polymorphism


【解决方案1】:

您的System.out.println 行打印String

String 在运行时被评估为b.h + " " + b.getH(),因此它将b.h、空格和方法b.getH() 的结果连接起来,因此它调用getH() 打印Beta 44,然后打印结果4 44

【讨论】:

    【解决方案2】:

    当你调用一个函数时,它的所有参数都必须首先被计算。在您的情况下,System.out.println 的唯一参数是表达式 b.h + " " + b.getH()

    由于这仍然是一个表达式,下一步是评估该表达式,这意味着确定表达式的值。它由具有 3 个操作数的 2 个 plus 运算符组成。为了计算加号运算符,程序必须计算操作数的值。

    b.h 的值计算为 4,因为变量在 Java 中是静态解析的。变量b 的类型是Baap 所以我们得到4。
    下一个值是 " ",它已经是一个字面量,所以没有什么可做的。
    之后我们有函数调用b.getH()。 Java 中的函数调用总是以虚拟方式解析,因此我们实际上调用了 getH 类型的 Beta 函数。这个函数只看到它自己的作用域,其中Beta 类中声明的变量h“遮蔽”了Baap 类中声明的变量,这意味着Baaph 变量对每个成员都是隐藏的Beta.
    为了评估函数调用,我们必须执行打印“Beta 44”并返回值 44 的函数。

    现在我们有了所有 3 个运算符的值,我们可以使用 + 运算符计算表达式。这导致字符串“4 44”现在被传递给 System.out.println 并最终打印在屏幕上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-21
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      相关资源
      最近更新 更多