Java 实例方法返回的是十六进制而不是字符串

Java 实例方法返回的是十六进制而不是字符串,java,Java,我正在练习如何编写类和创建对象之间的“是”关系。在下面的代码中,第一类“人”定义了一个人,然后在第二类“MarryDemo”中,我看到某人是否结婚,配偶是谁,地址等等。他们甚至很快就离婚了。代码从一开始就基于Jan Skansholm Java的示例 问题是,我希望MarryDemo中的主要方法的结果是“Kris Humphries”,“43新泽西喷气机街”,“空”,但不是我得到的配偶姓名Person@558ee9d6,配偶的地址和离婚后的配偶与我预期的一样 Person@558ee9d6表示什

我正在练习如何编写类和创建对象之间的“是”关系。在下面的代码中,第一类“人”定义了一个人,然后在第二类“MarryDemo”中,我看到某人是否结婚,配偶是谁,地址等等。他们甚至很快就离婚了。代码从一开始就基于Jan Skansholm Java的示例

问题是,我希望MarryDemo中的主要方法的结果是“Kris Humphries”,“43新泽西喷气机街”,“空”,但不是我得到的配偶姓名
Person@558ee9d6
,配偶的地址和离婚后的配偶与我预期的一样

Person@558ee9d6
表示什么?这就是“克里斯·汉弗莱斯”这个名字所指的物体的位置吗?为什么
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.

    }


您需要实现一个
toString()
方法(默认值不适用)。大多数IDE都会为您生成一个

什么是Person@558ee9d6意味着什么

对象的类名和标识。有关代码,请参见Object.toString()

这就是“克里斯·汉弗莱斯”这个名字所指的物体的位置吗

与名字无关。您正在调用的是Person.toString()

为什么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.

    }
你说你想把名字印在哪里


如果我将
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}" +
            '}';
}

您正在尝试将对象转换为字符串。这(自动)使用
Object
类中可用的
toString()
方法。结果以您描述的形式显示

如果您想将其转换为您自己的自定义字符串。您应该自己实现
toString()
方法。例如:

public String toString() {
  return name;
}

您正在打印
Person
对象。您可以覆盖
toString()
方法。e、 g

public String toString(){
    return this.getName();
}
或者

System.out.println(p1.marriedTo().getName());

p、 s.
isMarriedTo
是一个不好的方法名称,因为
is
通常用于返回布尔值的方法,
getdomen
将是一个更好的名称

您需要重写toString方法。默认行为是:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
因此,您看到的是附加了哈希代码的十六进制表示形式的类名。java怎么知道它应该打印name属性

您可以将其放在person方法中以显示名称:

@Override
public String toString() {
    return this.getName();
}

您的System.out.println(p1.marriedTo());似乎很少见,您正在尝试打印一个对象,它应该是System.out.println(p1.marriedTo().getName());我想,。在我的代码片段的上下文中,实现/覆盖toString()方法还是只编写System.out.println(p1.marriedTo().getName())更好?好的。我假设默认的IDE toString可以,但在本例中有一个循环引用。