我觉得输出是直的2 child 2
但是结果是child 1 2
???
当父指向子节点时,应使用子节点中的变量和方法,但是在字符串子节点之后打印1。为什么在s.i之前打印字符串?为什么它指的是父母的副本?
这是我的示例代码:
public class Abc
{
int i=1;
public int getStr()
{
system.out.print("parent");
return i;
}
public static void main(int[] a)
{
Abc s = new child();
system.out.print(s.i + " " + s.getStr());
}
}
class child
{
int i=2;
public int getStr()
{
system.out.print("child");
return i;
}
}
答案 0 :(得分:2)
我在这里假设你的意思是child
来扩展Abc
,那就是" psv"表示public static void
。另外,我认为Class Abc
确实是class Abc
而且system.out.print
确实是System.out.print
(大写问题)。
在main
中,新的child
已创建并分配给Abc
引用。在将表达式参数传递给方法之前,JVM必须将表达式参数计算为System.out.println
。
s.i
已静态解析为Abc
i
或1
- 没有变量多态,只有方法。
评估然后调用getStr()
。 child
类会覆盖getStr()
,因此会先打印child
,然后返回范围内的i
- 2
。
返回main
,表达式评估结束 - 1
加上空格加2
。因此,在已经打印的child
。
child1 2
答案 1 :(得分:1)
假设孩子确实扩展了Abc,请进行一次更改。不要宣称我是小孩,只是从Abc继承。换句话说,在孩子中,改变
int i=2;
到
i=2;
注意:您需要将它放在构造函数中。你正在做的是阴影导致各种混乱。 This post provides a nice example, very close to your question.
答案 2 :(得分:0)
解决输出中出现"child"
的问题:调用
System.out.print(s.i + " " + s.getStr());
与
相同System.out.print(s.i);
System.out.print(" ");
System.out.print(s.getStr());
在第一种情况下,程序必须首先计算整个输出字符串,然后才能打印任何内容,计算三个部分并创建一个连接字符串。然后打印出来。它不会一次打印三个部分(第二个例子的方式)。因此,当它计算字符串时,它会调用getStr()
,它将首先打印"child"
。这就是"child"
在"1 2"
之前的输出中出现的原因。