2014-05-11 156 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