我执行了以下程序,我很好奇我得到的输出,即使它是我试图先打印的变量,也会先打印出函数输出。
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
有人可以帮我理解为什么首先执行功能块吗?
答案 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并最终打印在屏幕上。