我正在练习学习如何编写类以及在对象之间创建“is”关系。在下面的代码中,第一个类“人”定义了一个人,然后在第二个类“MarryDemo”中,我看到是否有人结婚,配偶是谁,他们的地址等。他们甚至很快就离婚了。该代码基于Jan Skansholm Java from the Beginning。
的示例问题是我期望MarryDemo中主要方法的结果是“Kris Humphries”,“43 New Jersey Jets Street”,“null”,但是我得到Person@558ee9d6
的配偶名称,与配偶的地址和离婚后的配偶保持如我所料的那样。
Person@558ee9d6
表示什么?这是名为“Kris Humphries”的对象的位置吗?为什么Person@558ee9d6
出现而不是名字?
//defines a person
public class Person {
//instance variables
private String name, address;
private Person spouse;
//constructor
public Person(string n) {
name = n;
}
//instance methods
public String getName() {
return name;
}
public void marry(Person p) {
spouse = p;
p.spouse = this;
}
public Person isMarriedTo() {
return spouse;
}
... //more methods for returning address, divorcing, etc.
}
//
public class MarryDemo {
public static void main (String[] arg) {
String name1 = "Kim Kardashian";
String name2 = "Kris Humphries";
Person p1 = new Person(name1);
Person p2 = new Person(name2);
p1.marry(p2);
System.out.println(p1.marriedTo());
p2.setAddress("43 New Jersey Jets Drive");
System.out.println(p1.marriedTo().getAddress());
p1.divorce();
System.out.println(p1.marriedTo());
}
}
答案 0 :(得分:2)
您需要实现toString()
方法(因为默认值不合适)。大多数IDE都会为您生成一个。
Person @ 558ee9d6表示什么?
对象的类名和标识。请参阅Object.toString()以获取代码。
这是名为“Kris Humphries”的对象的位置吗?
与名字无关。你正在调用Person.toString()。
为什么会出现Person @ 558ee9d6而不是名字?
您认为要在哪里打印名称?
如果我用string
替换String
并使用IDE生成toString,则默认为
@Override
public String toString() {
return "Person{" +
"address='" + address + '\'' +
", name='" + name + '\'' +
", spouse=" + spouse +
'}';
}
这显然不合适,因为这将永远存在。您可以将其更改为
@Override
public String toString() {
return "Person{" +
"address='" + address + '\'' +
", name='" + name + '\'' +
", spouse=" + spouse != null ? spouse.getName() : " {none}" +
'}';
}
答案 1 :(得分:1)
您正在打印Person
对象。您可以覆盖toString()
方法。 e.g
public String toString(){
return this.getName();
}
或者,做
System.out.println(p1.marriedTo().getName());
P.S。 isMarriedTo
是一个错误的方法名称,因为is
通常用于返回布尔值的方法,getSpouse
将是一个更好的名称
答案 2 :(得分:0)
您正在尝试将对象转换为String。这(自动)使用toString()
类中提供的Object
方法。结果以您描述的形式出现。
如果您想将其转换为您自己的自定义字符串。您应该自己实施toString()
方法。例如:
public String toString() {
return name;
}
答案 3 :(得分:0)
您需要覆盖 toString方法。默认行为是:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
所以你看到的是带有附加哈希码的十六进制表示的类名。 java应该如何知道应该打印name属性?
您可以将此方法放在您的person方法中以显示名称:
@Override
public String toString() {
return this.getName();
}