2013-04-23 54 views
-3

這是類JavaTest簡單的繼承,但令人困惑的

package testing.test; 

public class JavaTest 
{ 
    int i=2; 
} 

這是類JavaTest2,它擴展JavaTest

package testing.test; 

class JavaTest2 extends JavaTest 
{ 
    public static void main(String[] args) { 


     new JavaTest2().add(5); 
    } 

    void add(int i) 
    { 
     System.out.println(5+i); 
    } 
} 

現在的輸出來10,實際的問題是得到家長的我值類添加..

+1

沒有任何複雜的邏輯。你只是打印5 + 5 ... – sashkello 2013-04-23 07:27:51

+3

@Anand沒有人知道所有這些東西。例如,如果您發佈JSF問題,與[BalusC](http://stackoverflow.com/users/157882/balusc)相比,您會看起來像noob,但不需要對任何人不禮貌(至少不在本網站)。 – 2013-04-23 07:33:08

+0

@LuiggiMendoza,問題改變了,看看,我不能發佈更多的問題,也可以upvote,如果可能的話,讓我發佈新的問題......但我需要解釋你上次做了,你​​解釋得很好 – anshulkatta 2013-05-16 10:02:58

回答

7

東西這裏是你的add方法陰影i變量聲明爲參數的類的屬性。因此,在add方法中使用i時,使用i參數,而不是i屬性。

要注意區別,改變add方法:

void add(int i) { 
    System.out.println(5+i); 
    System.out.println(5+this.i); //this will do the work for you 
} 

陰影的一個很好的例子是在類的構造方法:

public class SomeClass { 
    int x; 
    public SomeClass(int x) { 
     //this.x refers to the x attribute 
     //plain x refers to x parameter 
     this.x = x; 
    } 
} 

從評論跟進:

明白了,但如果我在JavaTest2中擁有和我一樣的成員,並且執行相同的操作,會發生什麼.i

這就是所謂的躲在和Oracle的Java教程是很好的解釋:Hiding Fields

例子:

class JavaTest2 extends JavaTest { 
    int i = 10; 
    void add(int i) { 
     System.out.println(5+i); 
     System.out.println(5+this.i); //this will add 5 to i attribute in JavaTest2 
     System.out.println(5+super.i); //this will add 5 to i attribute in JavaTest 
    } 
} 
+0

+1徹底回答 – 2013-04-23 07:30:50

+0

明白了,但如果我在JavaTest2中擁有與我相同的成員會發生什麼......並且執行相同的操作。i – anshulkatta 2013-04-23 07:37:10

+0

然後你的'JavaTest2'將會隱藏**'JavaTest'類中聲明的屬性**。 – 2013-04-23 07:38:08

1

您指的是i你收到的參數。嘗試this.i

void add(int i) 
{ 
    System.out.println(i + this.i); 
} 

這將在您的示例中打印7

0

您正在將5傳遞給add方法。到這5是5添加和打印

System.out.println(5+i); 

所以這裏沒有什麼讓人驚訝的。

JavaTest中初始化的i被方法聲明中的i遮蔽。定義使用最本地的變量。如果你想使用的方法領域i你可以改變你的方法是這樣的:

void add(int j) { 
    System.out.println(5+i); 
} 
0

add方法中,從超一流的i變量是不可見的。你用一個你也稱爲i的參數覆蓋它。

嘗試用這個替換您add()方法:

void add(int x) 
{ 
    System.out.println(5+i); 
} 

輸出將成爲7.你現在正在做的,有效的,是打印出來5+x

0

內部addi是從參數的一個不從父類

void add(int i) <----------------+ 
    {        | 
     System.out.println(5 + i); --+ 

     System.out.println(5 + this.i); --> member i 
    } 

THEREFOR add(5)後,將打印5+5繼承i - >10

要表示繼承i,請嘗試使用this.i來代替。

0

add()函數中的參數與class屬性具有相同的名稱。

重命名您的參數,它應該工作:

void add(int someNumber) 
{ 
    System.out.println(5+i); // result 7 
    System.out.println(5+someNumber); // result 10 
} 
0

如果你有範圍的局部變量(它是從。無論您在引用它的訪問),這將需要當地的一個。由於超類(JavaTest)中有一個實例變量,而add方法中有一個參數,因此將採用後者。

除非另有要求,一般建議將所有實例變量設爲私有。最重要的是,對局部變量和實例變量使用相同的名稱是非常糟糕的做法(它認爲這叫做陰影)。

0
  • 這是一個簡單的概念inheritance
  • 超類methodsinstance variables被繼承到基類。

  • i是由其基類繼承的JavaTest類的實例變量。

    空隙加載(int i)以{

    System.out.println(5+i); // i is already 5, so 5 + 5 = 10 
    

    }