2009-12-18 225 views
2

Here,它說:Java類繼承

這給山地車所有相同的字段和方法自行車,但允許其代碼完全集中於,使其獨特的功能。這使得您的子類的代碼易於閱讀。但是,必須注意正確記錄每個超類定義的狀態和行爲,因爲該代碼不會出現在每個子類的源文件中。

但是在我的代碼中,繼承無法正常工作,可能是由於我的代碼存在缺陷?

package java1; 

class bicycle { 
    int speed = 0; 
    int gear = 1; 

    void accelerate(int incr) { 
     speed = speed + incr; 
    } 

    void decelerate(int incr) { 
     speed = speed - incr; 
    } 

    void changeGear(int val) { 
     gear = val; 
    } 

    void printInfo() { 
     System.out.println("Speed: " + speed + " Gear: " + gear); 
    } 
} 

class mountainbike extends bicycle { 
    int speed = 10; 
} 

public class Main { 

    public static void main(String[] args) { 

     mountainbike mb1 = new mountainbike(); 

     mb1.accelerate(20); 
     mb1.accelerate(10); 

     mb1.printInfo(); 

    } 

} 

山地自行車班應該繼承自行車班的所有特點吧?我添加了一個獨特的屬性,它是int speed = 10,所以啓動速度應該是10。不過上運行的編譯器將啓動速度爲0

任何想法?

+0

感謝您的回覆。顯然,在編程世界中有很多種方法來解決障礙:D 現在我想我會使用構造函數併爲簡單起見分配'speed = 10',我真的不知道如何使用' public'和'private'和'super()'的東西。 – Fabian 2009-12-18 12:28:07

回答

6

不,你的Mountainbike類不應該重新定義speed變量。你需要的初始速度(10)傳遞給使用super其超類的構造函數的構造函數調用的一部分:

package java1; 

class Bicycle 
{ 

    Bicycle(int speed, int gear) 
    { 
    this.speed = speed; 
    this.gear = gear; 
    } 

    public void accelerate(int incr) 
    { 
    speed = speed + incr; 
    } 

    public void decelerate(int incr) 
    { 
    speed = speed - incr; 
    } 

    void changeGear(int val) 
    { 
    gear = val; 
    } 

    public String toString() 
    { 
    return "Speed: " + speed + " Gear: " + gear; 
    } 

    private int speed = 0; 
    private int gear = 1; 

} 

class Mountainbike extends Bicycle 
{ 
    public Mountainbike() 
    { 
    super(10, 1); 
    } 
} 

public class Main { 

    public static void main(String[] args) 
    {  
    Mountainbike mb1 = new Mountainbike(); 

    mb1.accelerate(20); 
    mb1.accelerate(10); 

    System.out.println(mb1); 
    } 
} 

我會建議不要使用速度和檔位protected變量。它是通過在基類中聲明speedgear變量private執行封裝好的做法。


編輯:

顯然,你用Java編程開始。我建議你看看這本由Bruce Eckel編寫的免費在線書:Thinking in Java

+2

可以downvoter指出問題,以便我可以糾正它嗎? – 2009-12-18 10:58:35

1

事實上你重新聲明場速度類山地。

例如,你可以初始化速度在類山地自行車的構造。

class mountainbike extends bicycle { 
mountainbike() { 
    speed=10; 
} 
} 
3

你介紹一個mountainbikespeed變量,它隱藏了一個在bicycle。這是一個壞主意 - 在類型層次結構的不同級別使用兩個具有相同名稱的變量會造成混淆,特別是當它們都可訪問時。

相反,要在現有變量的值更改爲10。例如:

class mountainbike extends bicycle { 
    mountainbike() { 
     speed = 10; 
    } 
} 

IMO領域確實應該在基類中,通過屬性訪問,而不是私人 - 和正如其他人所發佈的那樣,在接受初始速度的基類中有一個構造函數也是一個好主意。

5
public class Bicycle { 
    private int speed; 

    public Bicycle (int speed) { 
     this.speed = speed; 
    } 
} 


public class Mountainbike extends Bicycle { 
    public Mountainbike() { 
     super(10); 
    } 
} 
+1

-1缺少解釋。 – Bombe 2009-12-18 10:56:28

+3

@Bombe,認真...... – 2009-12-18 11:05:31

+0

第二個'公共自行車(int speed){'(line 4)是什麼? – Fabian 2009-12-18 11:05:39

4

您不能覆蓋字段,只能使用方法。你要做的是什麼標記speed場爲protected,構造函數添加到您的子類,並在構造函數中設置字段的值,就像這樣:

class Mountainbike extends Bicycle { 
    public Mountainbike() 
    { 
     speed = 10; 
    } 
} 

順便說一句,請注意,我已經糾正你的類名:Java的對大寫的類名稱具有壓倒性的強大慣例;使用小寫的類名只會混淆查看代碼的人。

+0

我建議不要使用'protected'變量。一個'私人int速度'變量強制封裝更好。 – 2009-12-18 11:00:55

+1

你如何將其標記爲受保護的?我知道在構造函數中設置字段(這意味着變量,對嗎?)的價值,但我不明白你是如何保護字段的。 – Fabian 2009-12-18 11:06:49

+0

@Fabian:在聲明變量時,你只需寫'protected int speed;'。請參閱http://www.codeguru.com/java/tij/tij0020.shtml#Index45 – 2009-12-18 11:10:39

1

在Java中,有一個概念scopes。什麼情況是,變速實際上沒有得到重寫,因此它仍然默認爲0。

0

你躲着走bicycle.speedmountainbike.speed所以基本上每個山地實例具有速度兩個int成員變量,一會this.speed和其他this.super.speed

而不是在山地自行車內重新聲明int速度,你應該創建一個山地自行車的默認構造函數,並在那裏設置this.speed = xxx;

1

你不能覆蓋一個字段,只能是方法。

class bicycle { 
    int getSpeed() { 
     return 0; 
    } 
    // ... other things 
} 

class mountainbike extends bicycle { 
    int getSpeed() { 
     return 10; 
    } 
    // ... other things 
}