2016-04-01 27 views
-2

它的輸出是怎麼來的?我懷疑是否在兩種情況下都創建了哪個類。我是java中的新成員,請簡單介紹一下對象實例化過程。 在這個程序中,我期望輸出爲150,但ans in = s 90. 方法和數據變量如何訪問差異?您能否介紹一下代碼之間的區別

程序1:

class Bike 
{ 
    int speedlimit=90; 
} 
class Honda3 extends Bike 
{ 
    int speedlimit=150; 
    public static void main(String args[]) 
    { 
     Bike obj=new Honda3(); 
     System.out.println(obj.speedlimit);//90 
    } 
} 

程序2:

class Bike 
{ 
    int speedlimit=90; 
    void display() 
    { 
     System.out.println(speedlimit); 
    } 
} 
class Honda3 extends Bike 
{ 
    int speedlimit=150; 
    void display() 
    { 
     System.out.println(speedlimit); 
    } 
    public static void main(String args[]) 
    { 
     Bike obj=new Honda3(); 
     obj.display(); 
    } 
} 

解釋這兩個碼之間的差異。 在程序1中,創建了對象Honda3,並將其指定給Bike類型的obj。我不明白超類方法是如何執行的?

+2

字段不是多態的。當你訪問'Bike'的引用上的'obj.speedlimit'時,無論在'Bike'的具體子類中是否存在一個名爲'speedlimit'的字段,都會得到'Bike.speedlimit'。 –

回答

1

當一個子類聲明具有相同簽名(方法名稱+參數類型)的方法,作爲在基類的方法,該基類的方法是重寫

這意味着即使將用於進行調用的變量聲明爲基類,也始終爲子類的對象調用子類方法。


當一個子類聲明的字段具有相同名稱作爲基類的字段,基類的字段是隱藏,但他們都仍然存在,可以有不同的值。

基類中的代碼將訪問基類中的字段。

子類中的代碼將訪問子類中的字段。基類中的字段已隱藏,但可以通過super.進行排位來訪問。

類外部的代碼將訪問編譯器可見的字段,即用於訪問字段的變量類中的字段。


因此,當使用Bike obj = new Honda3(),您可以:

  • obj.display()將調用Honda3.display()方法。
  • obj.speedlimit將訪問Bike.speedlimit字段。

出於這些原因,現場隱藏大NO,NO!
不要這樣做。代碼變得模糊不清,可能不像您認爲的那樣行事。

任何好的IDE會警告你,如果你這樣做。

覆蓋的方法基本類方法應始終使用@Override進行註釋。編譯器將驗證該方法實際上是否覆蓋基類方法,以確保您不會弄亂方法簽名。

如果您不註釋,任何好的IDE都會警告您,以確保在您不打算這樣做時不會意外覆蓋基類方法。

0

我不明白超類方法是如何執行的?

您無法調用超類的重寫方法的實現。這是設計。如果他們有不同的目的,你不應該給兩個方法使用相同的名字,而應該重寫另一個。

class Bike { 
    int speedlimit=90; 
    void display() { 
     System.out.println(speedlimit); 
    } 
} 

class Honda3 extends Bike { 
    int overdriveSpeedlimit=150; 
    void displayOverdrive() { 
      System.out.println(overdriveSpeedlimit); 
    } 
} 

public static void main(String[] args) { 
    Honda3 honda= new Honda3(); 
    honda.displayOverdrive(); 
    Bike obj = honda; 
    obj.display(); 
}