2014-05-11 157 views
0

我似乎有一個關於我已經準備好的構造函數的輸出的問題。構造函數輸出不正確?

當我學習Java時,我試圖熟悉構造函數及其重要性。

我想要做的就是輸出汽車類型。

這裏是我的代碼:

public class Car 
{ 

public String cm; 
public int hp; 
public String col; 
public String vtype; 
public String intr; 
public int ts; 



Car(String carMake, int horsePower, String colour, String vehicleType, String interior, int topSpeed){ 
    carMake = cm; 
    horsePower = hp; 
    colour = col; 
    vehicleType = vtype; 
    interior = intr; 
    topSpeed = ts; 
} 


public static void main (String [] args){ 
    Car carA = new Car("BMW", 2000, "Black", "1 Series", "Leather", 155); 

    System.out.println("This is your car: " + carA); 
    } 
} 

然而,我的輸出是這樣的:

This is your car: [email protected] 

可有人請指出爲什麼輸出是這個樣子?

非常感謝。

回答

1

首先你的構造函數是錯誤的。這不是你如何編寫構造函數,而是將一些參數傳遞給構造函數,並將這些參數分配給你的類變量。所以你的情況你的構造將是繼,

Car(String carMake, int horsePower, String colour, String vehicleType, String interior, int topSpeed){ 
    cm = carMake; 
    hp = horsePower; 
    col = colour; 
    vtype = vehicleType; 
    intr = interior; 
    ts = topSpeed; 
} 

而且對於解決你的問題是什麼,你正在尋找被重寫級車的toString方法。這可以按照以下方式完成。

@Override 
public String toString() 
{ 
    StringBuilder sb = new StringBuilder(); 
    sb.append("Car Make: "); 
    sb.append(cm); 
    sb.append("\n"); //You can use System.getProperty("line.separator") if you want to make it platform independent 
    sb.append("Car colour: "); 
    sb.append(col); 
    //You can append as many details of your class car this way. 
    //and finally just return the StringBuilder as String. 
    return sb.toString(); 
} 
+0

感謝您的回答,以及對我的構造函數的幫助。非常豐富。 – PrimalScientist

+0

如果它對你有幫助,請做出回覆並接受答案。還問你是否有更多疑問。 – Setu

+0

就個人而言,我會避免在toString中使用StringBuilder,代碼將會更長,並且根本沒有任何改進(編譯器會使用StringBuilder改進它) –

2

默認情況下,Java是如何將對象實例轉換爲字符串的。通過創建名稱組成的類名稱(Car)和附加@與一些「唯一」的ID。爲了使其更具人性可讀性,您必須重載班級中的public String toString()方法。

+0

很好的答案,謝謝。 – PrimalScientist

1

你所做的每一個類,從Object類有一些方法繼承和其中之一是.toString()它用於通用Object轉換爲String ...它用於「用戶」的輸出。

默認情況下

public String toString() { 
    return getClass().getName() + '@' + Integer.toHexString(hashCode()); 
} 

將返回類,@和當前對象的hashCode的名稱。

爲了讓您的課堂有一個非常漂亮的輸出,您應該重寫它。

例子:

@Override 
public String toString() 
{ 
    return "My car is a " + cm; 
} 

(注:@Override和方法的名稱相同)

與您的代碼的另一個問題是無論如何的事實,你不改變類的字段,不過參數值

Car(String carMake, int horsePower, String colour, String vehicleType, String interior, int topSpeed){ 
    carMake = cm; 
    horsePower = hp; 
    colour = col; 
    vehicleType = vtype; 
    interior = intr; 
    topSpeed = ts; 
} 

正如你所看到的,你的carMake值更改爲(這將是構造遊離缺失後)。這是null(因爲它是一個字符串),所以你的輸出將是空的和0的東西。反轉它cm = carMake使它工作。 (與其他相同)

+0

我現在看到。是的,我會相應修改代碼。 謝謝你的回答。非常豐富。 – PrimalScientist

+0

感謝Marco。我如何返回多個值?如hp,col,vtype等? 非常感謝。 – PrimalScientist