2012-03-07 24 views
1

私はクラスの作成方法とオブジェクト間の "is"関係の作成方法を学んでいます。以下のコードでは、ファーストクラスのPersonがPersonを定義し、次に、2番目のクラスMarryDemoで、誰かが結婚しているか、その配偶者であるか、その住所などを確認します。その後もすぐに離婚します。このコードは、Jan Skansholm Javaの初めからの例に基づいています。インスタンスメソッドが文字列の代わりに16進数を返しています

問題はで、代わりに私は[email protected]を得た配偶者の名前の、私は「ヌル」「クリス・ハンフリーズ」、「43ニュージャージージェッツ・ストリート」であるとMarryDemoの主な方法の結果を期待していることです配偶者の住所と離婚後の配偶者は、私が期待した通りに残っていた。

[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

+0

私のコードスニペットの文脈では、toString()メソッドを実装/上書きするか、System.out.println(p1.marriedTo()。getName())を書くことが望ましいですか? – milou

答えて

2

あなたは(デフォルトは適切ではないとして)toString()メソッドを実装する必要があります。ほとんどのIDEが生成します。

Person @ 558ee9d6は何を表していますか?

オブジェクトのクラス名とID。コードについては、Object.toString()を参照してください。

"Kris Humphries"という名前で参照されるオブジェクトの場所ですか?

名前とは関係ありません。あなたが呼んでいるのはPerson.toString()です。

名前の代わりにPerson @ 558ee9d6が表示されるのはなぜですか?

あなたは代わりに名前を印刷したいと思いますか?私はStringstringを交換してのtoStringを生成するためのIDEを使用している場合


、デフォルトでは、これが永遠に回るので、これは明らかに適切ではない

@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

+1

ok。私は、デフォルトのIDE toStringはうまくいくと仮定しましたが、この場合は循環参照があります。 –

0

オブジェクトを文字列に変換しようとしています。これは(自動的に)Objectクラスで利用可能なtoString()メソッドを使用します。結果はあなたが記述した形になります。

独自のカスタマイズされた文字列に変換する場合は、あなた自身でtoString()メソッドを実装する必要があります。例:

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

修正: '_オブジェクトを文字列に変換しようとしています'。 – xtofl

+0

おっと、ありがとうございます! – Veger

1

Personオブジェクトを印刷しています。 toString()メソッドを上書きするか、 e。グラム

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

あるいは、

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

P.S.を行いますisMarriedToあなたがオーバーライド toStringメソッドに必要isは通常、boolean型を返すメソッドのために使用されているため、getSpouseがはるかに良い名前

0

だろう悪いメソッド名です。デフォルトの動作は次のとおりです。

このように、表示されるのは、ハッシュコードの16進表現が追加されたクラス名です。どのようにJavaは、それが名前プロパティを出力する必要があることを知っているはずですか?

あなたが名前を表示するために、あなたの人の方法でこれを置くことができます:

@Override 
public String toString() { 
    return this.getName(); 
} 
関連する問題