java中的继承变量和方法

java中的继承变量和方法,java,inheritance,overriding,Java,Inheritance,Overriding,我觉得输出是直接的2 child 2,但结果是child 12 当parent指向child时,应该使用child中的变量和方法,但在字符串child之后打印1。为什么字符串在s.i.之前打印?为什么它指的是父母的i 以下是我的示例代码: public class Abc { int i=1; public int getStr() { system.out.print("parent"); return i; } public static void mai

我觉得输出是直接的
2 child 2
,但结果是
child 12

当parent指向child时,应该使用child中的变量和方法,但在字符串child之后打印1。为什么字符串在s.i.之前打印?为什么它指的是父母的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;
  }
}

假设孩子确实扩展了Abc,做一个改变。不要在孩子身上声明我,只是从Abc继承。换句话说,在孩子身上,改变

int i=2;


注意:您需要将其放入构造函数中。你所做的是阴影,这会引起各种混乱

这里我假设您的意思是
child
扩展
Abc
,而“psv”的意思是
publicstaticvoid
。另外,我假设
Class Abc
实际上是
Class Abc
,而
system.out.print
实际上是
system.out.print
(大写问题)

main
中,将创建一个新的
,并将其分配给
Abc
引用。JVM必须在将表达式参数传递给方法之前,对其求值为
System.out.println

s.i
静态解析为
Abc
i
,或
1
——没有变量多态性,只有方法

然后,求值调用
getStr()
child
类重写
getStr()
,因此它首先打印
child
,并返回范围--
2
中的
i

回到
main
,表达式求值完成--
1
加上空格加
2
。因此,该表达式被打印,紧跟在已打印的
子项之后

child1 2

要解决输出中“child”出现在何处的问题:调用

System.out.print(s.i + " " + s.getStr());
不一样

System.out.print(s.i);
System.out.print(" ");
System.out.print(s.getStr());

在第一种情况下,程序必须首先计算整个输出字符串,然后再打印任何内容,方法是计算三个部分并创建一个串联字符串。然后打印出来。它不会一次一部分地打印三个部分(第二个示例的方式)。因此,在计算字符串时,它调用
getStr()
,这将首先打印
“child”
。这就是为什么
“child”
出现在
“12”
之前的输出中

这看起来不像是有效的java,例如,
psv main()
Class
system.out.print()
。给我们一个可运行的代码。你能提供一个工作的例子吗?这个代码不会编译。。。dopes
child
extend
Abc
?@Takendarkk psv==
public static void
,这肯定不是有效的java代码。嘿,非常感谢……你是说方法调用将首先求值,然后变量将被解析?谢谢。。这正是我想要的。。。再次谢谢你,嗯。。。如果您只是将其更改为
i=2
,它将不会编译,因为您现在有一条语句不是方法的一部分。请将其放入构造函数中。它不像OP的代码曾经编译过。:-)
System.out.print(s.i);
System.out.print(" ");
System.out.print(s.getStr());