2012-03-07 84 views
1

我正在練習如何編寫類並創建對象之間的「is」關係。在下面的代碼中,第一個類「Person」定義了一個Person,然後在第二個類「MarryDemo」中,我看到了是否有人結婚,配偶是誰,他們的地址等。他們甚至很快就離婚了。該代碼基於Jan Skansholm 從開始的Java的示例。實例方法返回一個十六進制而不是一個字符串

的問題是,我預計在MarryDemo的主要方法的結果是「克里斯 - 亨弗里斯」,「43新澤西州噴氣機一條街」,「空」,但不是配偶的名字我[email protected],與配偶的地址和離婚後的配偶仍然如我預期的那樣。

[email protected]是什麼意思?那是由名字「Kris Humphries」引用的對象的位置嗎?爲什麼[email protected]出現而不是名稱?

//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

您的System.out.println(p1.marriedTo());你試圖打印一個對象,它應該是 System.out.println(p1.marriedTo()。getName());我猜, 。 – simaremare 2012-03-07 11:39:32

+0

在我的代碼片段的上下文中,最好是實現/覆蓋toString()方法還是隻寫System.out.println(p1.marriedTo()。getName())? – milou 2012-03-07 12:07:53

回答

2

你需要實現一個toString()方法(如默認爲不適合)。大多數IDE將爲您生成一個。

Person @ 558ee9d6表示什麼?

對象的類名和標識。代碼請參閱Object.toString()。

是名稱「Kris Humphries」引用的對象的位置?

與名稱無關。它是你正在調用的Person.toString()。

爲什麼Person @ 558ee9d6顯示而不是名稱?

你在哪裏說你想要打印名稱?


如果我更換stringString和使用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

也許你應該向OP展示一個樣本?還是太天真了? – adarshr 2012-03-07 11:38:02

+1

好的。我認爲默認的IDE toString會很好,但在這種情況下有一個循環引用。 – 2012-03-07 11:42:14

0

您試圖將對象轉換爲字符串。這(自動)使用Object類中的toString()方法。結果就是你描述的形式。

如果您想將其轉換爲您自己的自定義字符串。您應該自己實施toString()方法。例如:

public String toString() { 
    return name; 
} 
+0

更正:'嘗試將_object_轉換爲String。 – xtofl 2012-03-07 11:43:28

+0

哎呀,感謝您的注意! – Veger 2012-03-07 11:44:39

1

您正在打印Person對象。您可以覆蓋toString()方法。即摹

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

或者說,

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

附: isMarriedTo是因爲is通常用於返回布爾方法的一種不錯的名字,getSpouse會是一個更好的名字

0

需要覆蓋 toString方法。默認的行爲是:

public String toString() { 
    return getClass().getName() + "@" + Integer.toHexString(hashCode()); 
} 

所以你看到的是類名稱與附加的哈希碼的十六進制表示。 java應該如何知道它應該打印name屬性?

你可以把這個在你的人的方法來顯示名稱:

@Override 
public String toString() { 
    return this.getName(); 
} 
相關問題