instance方法返回十六进制而不是字符串

时间:2012-03-07 11:34:33

标签: java

我正在练习学习如何编写类以及在对象之间创建“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());

    }
}

4 个答案:

答案 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();
}