簡體   English   中英

Java中的繼承變量和方法

[英]Inherited variables and methods in java

我覺得輸出是2 child 2筆直2 child 2但結果是child 1 2

當父項指向子項時,應使用子項中的變量和方法,但在子項字符串后將打印1。 為什么在si之前打印字符串? 為什么引用父母的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;
  }
}

我在這里假設您的意思是child要擴展Abc ,而“ psv”則意味着public static void 另外,我假設Class Abc實際上是Class Abc class Abc ,而system.out.print實際上是System.out.print (大寫問題)。

main ,將創建一個新child並將其分配給Abc引用。 JVM必須先將表達式參數評估為System.out.println然后再將其傳遞給方法。

si靜態解析為Abci1沒有帶變量的多態性,只有方法。

然后評估調用getStr() child類將覆蓋getStr() ,因此它將首先打印child ,並返回范圍– 2i

回到main ,表達評價飾面- 1加一個空間,加上2 因此,該表達式將在已打印的child緊隨其后被打印。

child1 2

假設孩子確實擴展了Abc,請進行一項更改。 不要在孩子中聲明我,而應從Abc繼承。 換句話說,在孩子里,改變

int i=2;

i=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"在輸出中出現在"1 2"之前的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM