为什么首先调用Overrided函数?

时间:2016-03-01 15:48:15

标签: java inheritance polymorphism

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

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

有人可以帮我理解为什么首先执行功能块吗?

2 个答案:

答案 0 :(得分:4)

您的System.out.println行打印String

String在运行时评估为b.h + " " + b.getH(),因此它会连接b.h,空格和方法b.getH()的结果,因此它会调用{{1}打印getH(),然后打印结果Beta 44

答案 1 :(得分:0)

调用函数时,必须首先评估其所有参数。在您的情况下,System.out.println的唯一参数是表达式b.h + " " + b.getH()

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

b.h的值的计算结果为4,因为变量在Java中是静态解析的。变量b的类型为Baap,因此我们得到4.
下一个值是" ",它已经是一个文字,所以没有什么可做的 之后我们有函数调用b.getH()。 Java中的函数调用总是虚拟解析,因此我们实际上调用了getH类型的Beta函数。此函数仅查看其自己的范围,其中变量h在类Beta"阴影"中声明。在课程Baap中声明的那个,意味着h的{​​{1}}变量对Baap的每个成员都隐藏了。
为了评估函数调用,我们必须执行打印" Beta 44"并返回值44。

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