我创建了几个自定义类的对象并为它们分配了不同的属性。然后我将这些对象中的每一个添加到一个向量中,但是当我尝试输出向量的元素时,我得到的只是对对象的引用,而不是对象属性。
5 回答
当您调用System.out.println()
(或类似方法)并将其传递给类的实例时,会隐式调用该类的toString()
方法。您看到的是从类toString()
继承的默认实现。Object
如果您想更改输出,只需toString()
在您的类中提供您自己的实现,返回您想要的信息。
您可以使用增强的for
循环访问它们:
Vector<YourObject> vector = ...;
for(YourObject obj : vector)
{
System.out.println(obj.YOUR_METHOD_OR_ATTRIBUTE);
}
或通过使用elementAt(position)
:
System.out.println(vector.elementAt(position).YOUR_METHOD_OR_ATTRIBUTE);
或者最后,覆盖该toString()
方法并使用:
System.out.println(vector.elementAt(position));
当您打印任何类的实例时,Object
将调用类的 toString() 方法。
您需要覆盖toString
自定义类中的方法,并打印您想要的属性。然后toString()
将调用您的方法而不是Object's
toString..
或者,您可以有一个getter
方法,并在每个实例上调用它
public class Custom {
private String attr;
public String getAttr() {
return this.attr;
}
@Override
public String toString() {
return attr;
}
}
然后,当您打印您的实例时,toString()
将被调用,并且attr
将打印值。
Vector<Custom> yourVector = ...;
for (Custom val: yourVector) {
System.out.println(val); // Will invoke `toString()` and print attr value.
System.out.println(val.getAttr()); // Prints attr value
}
在 Vector 上使用泛型很重要。如果不这样做,您将获得 java.lang.Object 类型的对象,除非您强制转换它们。
所以像这样定义它:
Vector<MyObject> vector = new Vector<MyObject>();
代替
Vector vector = new Vector();
如果您使用System.out.println(v)
,其中 v 是您Vector
的元素,那么您需要实现toString()
自定义对象的方法。这样,您将覆盖您现在获得的默认 Object#toString() 行为。