2014-07-18 91 views
-1

我觉得输出是直的2 child 2,但它原来是child 1 2 ???在java中继承变量和方法

由于家长指向孩子,应该使用孩子的变量和方法,但是在孩子的字符串后面打印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; 
    } 
} 
+4

这看起来不像有效的java例如'psv ma​​in()'''''''''system.out.print()'。为我们提供可运行的代码。 – csmckelvey

+0

你能提供一个可行的例子吗? –

+1

这段代码不会编译... dopes'child' extends'Abc'? – ApproachingDarknessFish

回答

2

我在这里假定您的意思是child扩展Abc,而“psv”表示public static void。另外,我假设Class Abc确实是class Abcsystem.out.print确实是System.out.print(资本化问题)。

main中,创建了新的child并将其分配给Abc参考。 JVM必须先将表达式参数评估为System.out.println,然后再将它传递给方法。

s.i静态解析为Abci,或1 - 没有多态性与变量,只有方法。

评估然后调用getStr()child类将覆盖getStr(),因此它首先打印child,并在范围内返回i - 2

返回main,表达式评估结束 - 1加空格加2。因此,在已经打印的child之后立即打印表达式。

child1 2 
+0

嘿,非常感谢...所以你的意思是方法调用将被评估第一,然后变量将被解决? – user1079065

+0

我清理了我的解释。 – rgettman

1

假如孩子不延长ABC,做出一个改变。不要声明我在孩子身上,只是从Abc继承而来。换句话说,儿童,改变

int i=2; 

i=2; 

注意:您将需要把这个在构造函数中。你在做什么是造成各种混乱的阴影。 This post provides a nice example, very close to your question.

+0

谢谢..这正是我正在寻找的...再次感谢 – user1079065

+2

嗯......如果你只是改变它为'i = 2'它不会编译,因为你现在有一个声明不是部分的一种方法。 – ajb

+0

把它放在构造函数中。它不像OP有史以来的代码。 :-) – user949300

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"之前的输出中。