95

少しばかげているように聞こえますが、私のtoString()方法について助けが必要で、非常にイライラしています。オンラインで調べてみたのtoStringは、そこにあるのに「キッドコンストラクター#2が見つからない」という問題があり、他のことをしてもうまくいかないからです。それはたくさんあったので、ここに私のコードがあります:

import java.util.*; 
   class Kid {  
      String name; 
      double height; 
      GregorianCalendar bDay; 

      public Kid () { 
         this.name = "HEAD";
         this.height = 1; 
         this.bDay = new GregorianCalendar(1111,1,1); 
      } 

      public Kid (String n, double h, String date) {
      // method that toString() can't find somehow
         StringTokenizer st = new StringTokenizer(date, "/", true);
         n = this.name;
         h = this.height;
      } 

      public String toString() { 
         return Kid(this.name, this.height, this.bDay);
      } 
   } //end class 

わかりましたので、上記の toString (3 番目のパラメーターがオフになっていることはわかっています。文字列である必要があります) はオフです。3 番目の値をハードコーディングすると、おかしくなり、これが見つからないと表示されます (上記)。では、どうすれば日付を取得して分割できますか?

これを呼び出すクラスは以下のとおりです

class Driver {   
   public static void main (String[] args) {   
      Kid kid1 = new Kid("Lexie", 2.6, "11/5/2009");   
      System.out.println(kid1.toString());
   } //end main method 
} //end class  

複数のコンストラクターを調査してみましたが、実際には役に立ちませんでした。toString()メソッドを調査toString()してみました。以前に作成した以前のメソッド ロジックを使用してみましたが、これはまったく新しいため、機能しませんでした。

ヘルプ?

4

14 に答える 14

147

toStringを返すはずStringです。

public String toString() { 
    return "Name: '" + this.name + "', Height: '" + this.height + "', Birthday: '" + this.bDay + "'";
} 

IDE の機能を利用してtoStringメソッドを生成することをお勧めします。ハンドコーディングしないでください。

たとえば、Eclipse では、ソース コードを右クリックして、Source > Generate toString

于 2012-05-24T08:52:48.003 に答える
15

Java toString() メソッド

オブジェクトを文字列として表現したい場合、 toString() メソッドが登場します。

toString() メソッドは、オブジェクトの文字列表現を返します。

オブジェクトを印刷する場合、Java コンパイラは内部的にオブジェクトの toString() メソッドを呼び出します。したがって、 toString() メソッドをオーバーライドすると、目的の出力が返されます。これは、オブジェクトの状態などである可能性があります。実装によって異なります。

Java toString() メソッドの利点

Object クラスの toString() メソッドをオーバーライドすることで、オブジェクトの値を返すことができるため、多くのコードを記述する必要はありません。

toString() メソッドなしの出力

class Student{  
 int id;  
 String name;  
 String address;  

 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 }  

 public static void main(String args[]){  
   Student s1=new Student(100,”Joe”,”success”);  
   Student s2=new Student(50,”Jeff”,”fail”);  

   System.out.println(s1);//compiler writes here s1.toString()  
   System.out.println(s2);//compiler writes here s2.toString()  
 }  
}  

Output:Student@2kaa9dc
       Student@4bbc148

上記の例 #1 で確認できます。s1 と s2 を印刷すると、オブジェクトのハッシュコード値が印刷されますが、これらのオブジェクトの値を印刷したいと考えています。Java コンパイラは内部的に toString() メソッドを呼び出すため、このメソッドをオーバーライドすると、指定された値が返されます。以下の例でそれを理解しましょう。

Example#2

Output with overriding toString() method

class Student{  
 int id;  
 String name;  
 String address;  

 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 }  

//overriding the toString() method  
public String toString(){ 
  return id+" "+name+" "+address;  
 }  
 public static void main(String args[]){  
   Student s1=new Student(100,”Joe”,”success”);  
   Student s2=new Student(50,”Jeff”,”fail”);  

   System.out.println(s1);//compiler writes here s1.toString()  
   System.out.println(s2);//compiler writes here s2.toString()  
 }  
} 

Output:100 Joe success
       50 Jeff fail

toString() は、主に Java のポリモーフィズムの概念に関連していることに注意してください。Eclipse で、toString() をクリックして右クリックします。次に、[Open Declaration] をクリックして、スーパークラス toString() の由来を確認します。

于 2015-07-02T01:31:59.353 に答える
9

他の人が説明したようにtoString、クラスをインスタンス化する場所ではありません。代わりに、このtoStringメソッドはクラスのインスタンスの値を表す文字列を作成し、そのオブジェクトに格納されているデータの少なくとも最も重要なフィールドについて報告することを目的としています。ほとんどの場合、toStringビジネス ロジックではなく、デバッグとロギングに使用されます。

ユーザーに表示するオブジェクトの値を表すテキストを生成するには、別のメソッドを追加します。人々はしばしばメソッドに のような名前を付けgetDisplayNameます。たとえば、DayOfWeek::getDisplayNameMonth::getDisplayName.

StringJoiner

Java 8 以降では、最も近代的な実装方法はクラスtoStringを使用することです。StringJoinerドキュメントが言うように:

StringJoiner は、デリミタで区切られた一連の文字を構築するために使用されます。オプションで、指定された接頭辞で始まり、指定された接尾辞で終わります。

次のように使用します。

@Override
public String toString ()
{
    return new StringJoiner(                           // In Java 8 and later, StringJoiner is used to construct a sequence of characters separated by a delimiter and optionally starting with a supplied prefix and ending with a supplied suffix.
                " | " ,                                // Delimiter
                Person.class.getSimpleName() + "[ " ,  // Prefix
                " ]"                                   // Suffix
            )
            .add( "name=" + name )                     // Append
            .add( "phone=" + phone )                   // Append
            .toString();                               // Convert entire sequence to a single `String` object.
}

人[ 名前=アリス | 電話=555.867.5309]

record

Java 16 は、データを透過的かつ不変的に通信することを主な目的とするクラスを簡単に定義する新しい方法であるrecordをもたらします。

各メンバー フィールドのタイプと名前をリストするだけで、レコードを定義します。コンパイラは、コンストラクター、ゲッター、equals& hashCode、および を暗黙的に作成しtoStringます。

のデフォルト実装toString

のデフォルトの実装にtoStringは、すべてのメンバー フィールドが含まれます。

public Kid ( String name , double height , LocalDate birthDate ) {} 

他のオブジェクトと同じようにインスタンス化します。

Kid alice = new Kid( "Alice" , 6.1d , LocalDate.of( 2019 , Month.April , 23 ) ) ;
String output = alice.toString() ;

デフォルトの実装を独自のものでオーバーライドすることもできます。単純なデータキャリアとしてのレコードの目的を考えると、オーバーライドは通常必要ありません。

于 2019-02-23T03:38:26.910 に答える
4

toString() で新しいオブジェクトを作成できます。使用する

return "Name = " + this.name +" height= " + this.height;

それ以外の

return Kid(this.name, this.height, this.bDay);

必要に応じて戻り文字列を変更できます。カレンダーの代わりに日付を保存する方法は他にもあります。

于 2012-05-24T08:53:31.170 に答える
3

通常のメソッドのようにコンストラクターを呼び出すことはできませんnew。新しいオブジェクトを作成するためにのみ呼び出すことができます。

Kid newKid = new Kid(this.name, this.height, this.bDay);

しかし、toString() メソッドから新しいオブジェクトを構築することは、あなたがやりたいことではありません。

于 2012-05-24T08:53:50.577 に答える
2

次のコードはサンプルです。IDE ベースの変換を使用する代わりに、同じことに基づいて質問します。将来変更が発生し、値を何度も変更する必要がないように実装するより高速な方法はありますか?

@Override
    public String toString() {
        return "ContractDTO{" +
                "contractId='" + contractId + '\'' +
                ", contractTemplateId='" + contractTemplateId + '\'' +
                '}';
    }
于 2014-09-09T13:23:45.520 に答える
2

単体テストに興味がある場合は、パブリックの "ToStringTemplate" を宣言してから、toString の単体テストを行うことができます。単体テストをしなくても、「よりクリーン」で String.format を使用していると思います。

public class Kid {

    public static final String ToStringTemplate = "KidName='%1s', Height='%2s', GregCalendar='%3s'";

    private String kidName;
    private double height;
    private GregorianCalendar gregCalendar;

    public String getKidName() {
        return kidName;
    }

    public void setKidName(String kidName) {
        this.kidName = kidName;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public GregorianCalendar getGregCalendar() {
        return gregCalendar;
    }

    public void setGregCalendar(GregorianCalendar gregCalendar) {
        this.gregCalendar = gregCalendar;
    }

    public String toString() { 
        return String.format(ToStringTemplate, this.getKidName(), this.getHeight(), this.getGregCalendar());
    } 
}

これで、Kid を作成し、プロパティを設定し、ToStringTemplate で独自の string.format を実行して比較することで、単体テストを実行できます。

ToStringTemplate を static-final にすることは、単体テストでテンプレートの「コピー」を使用するのではなく、真実の「1 つのバージョン」を意味します。

于 2018-10-29T15:56:06.630 に答える
1

toString は文字列を返す必要があるため、実際にはこのようなものを返す必要があります

public String toString() {
 return "Name :" + this.name + "whatever :" + this.whatever + "";
}

そして、逆のことをする必要があるときに、ユーザーが名前に設定した変数を設定するコンストラクターで実際に何か間違ったことをします。してはいけないこと

n = this.name

あなたがすべきこと

this.name = n

これが役立つことを願っています

于 2015-07-02T02:51:52.543 に答える
1

常に簡単な方法があります:右クリック>生成> toString() >必要なテンプレートを選択します。 ここに画像の説明を入力

于 2020-08-06T15:03:34.273 に答える
1

クラスで新しい String オブジェクトを作成し、コンストラクターで必要なものを割り当て、オーバーライドされた toString メソッドでそれを返すことで、このように書くこともできます

public class Student{  
 int id;  
 String name;  
 String address;  
 String details;
 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 this.details=id+"  "+name+"  "+address;  
 }  

//overriding the toString() method  
public String toString(){ 
  return details;  
 }  
 public static void main(String args[]){  
   Student s1=new Student(100,"Joe","success");  
   Student s2=new Student(50,"Jeff","fail");  

   System.out.println(s1);//compiler writes here s1.toString()  
   System.out.println(s2);//compiler writes here s2.toString()  
 }  
}
于 2016-12-20T15:53:45.267 に答える