java中的继承变量和方法

时间:2014-07-18 00:16:43

标签: java inheritance method-overriding

我觉得输出是直的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;
  }
}

3 个答案:

答案 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 i1 - 没有变量多态,只有方法。

评估然后调用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"之前的输出中出现的原因。