3

MichaelErnestの著書「JavaSE7ProgrammingEssentials」を使用して、JavaOCAテストを行うことを勉強しています。これは、以下の質問に対する回答の1つに対する私のコードです。

public class Point3D {
    int x, y, z;

    public void setX(int x) {
        this.x = x;
    }

    public int getX() {
        return this.x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getY() {
        return this.y;
    }

    public void setZ(int z) {
        this.z = z;
    }

    public int getZ() {
        return this.z;
    }

    public String toString(Point3D p) {
        String result = p.getX() + "," + p.getY() + "," + p.getZ();
        return result;
    }

    public static void main(String args[]) {
        Point3D point = new Point3D();
        point.setX(5);
        point.setY(12);
        point.setZ(13);
        System.out.println(point.toString(point));
    }
}

私のコードは機能しますが、最後の行で、私は奇妙な方法でコードを作成したと思います。ポイントの文字列表現を返さpoint.toString()ずに作成する方法があるべきではありませんか?point.toString(point)誰かがそれを修正する方法を私に説明できますか?

私はそれが私のJava知識の穴を指していると思うので、それを理解しようとしているだけの簡単な答えだと確信しています。

4

13 に答える 13

8

あなたのメソッドpublic String toString(Point3D p)はオーバーライドしていません。これは、の表現Object.toString()を取得するための標準的な方法です。StringObject

これをオーバーライドするポイントは、のサブクラスがObjectオブジェクトの適切な表現をとして提供できるようにすることStringです。Java APIは、多くの状況でこのメソッドを使用します。主に、をに変換する必要があるObject場合String(たとえば、を実行する場合System.out.println(object)、または文字列連結を実行する場合)。

String s = "The point is " + pointObject;

ay89が提案したように実装します。

@Override
public String toString() { 
    String result = getX() + "," + getY() + "," + getZ(); 
    return result;
} 

注釈の使用法に注意してください@Override。メソッドで使用した場合、コンパイラーは、その定義に問題があることを警告します。

于 2013-03-25T12:37:32.073 に答える
5

使ってみませんか

public String toString() {
    String result = getX() + "," + getY() + "," + getZ();
    return result;      
}

その後、あなたはただ使うことができますSystem.out.println(point)

于 2013-03-25T12:36:08.660 に答える
3

String.formatわかりやすくするために、連結の代わりに使用します。

public String toString() {
    return String.format("(%d, %d, %d)", x, y, z);      
}

この方法を使用すると、コードのリーダーからの「精神的な再構築」をあまり必要としない方法で、出力の外観を変更できます。たとえば、出力を次のように変更する場合は{x=1, y=2, z=3}、フォーマット行を次のように書き直すだけです。

return String.format("{x=%d, y=%d, z=%d}", x, y, z);
于 2013-03-25T12:39:11.170 に答える
3

OK、私はそれを自分で解決しました-質問を投稿することは私にとってラバーダックとほとんど同じであることがわかりました。

別のメソッドを追加する必要がありました:

public String toString() {
    String result = this.getX() + "," + this.getY() + "," + this.getZ();
    return result;      
}
于 2013-03-25T12:39:14.973 に答える
2

toString()メソッドをオーバーライドする必要があります。JavaのすべてのオブジェクトにはtoStringメソッドがあります(これはObjectクラスのメソッドです)。

デフォルトのObject実装は、そのオブジェクトのhashCodeを返すだけです(したがって、オーバーライドしない場合は、それも取得されます)が、オーバーライドすると、オブジェクトに固有のデータでより意味のあることを行うことができます。

@Override  
public String toString() {
   return this.getX() + "," + this.getY() + "," + this.getZ(); 
}
于 2013-03-25T12:36:50.883 に答える
1

thisパラメータの代わりに使用することもできますp。したがって、関数自体でメソッドをpublic String toString()に変更し、pに変更します。this

于 2013-03-25T12:36:38.583 に答える
0

これを試して

public String toString() {
    String result = this.getX() + "," + this.getY() + "," + this.getZ();
    return result;
}
于 2013-03-25T12:36:51.747 に答える
0

これで修正されるはずです:

public String toString() {
String result = this.getX() + "," + this.getY() + "," + this.getZ();
return result;      
}
于 2013-03-25T12:37:19.707 に答える
0

このようにする

 public String toString() {
        String result = this.getX() + "," + this.getY() + "," + this.getZ();
        return result;
    }

これは呼び出し元オブジェクト(あなたの場合はポイント)への内部参照であるため、これを使用すると引数ポイントの必要性が無効になります

于 2013-03-25T12:37:33.707 に答える
0

このコード:

@Override
public String toString() {
    return "{ x: " + x + ", y: " + y + ", z: " + z + " }";
}

これを出力します:

{ x: 13, y: 2, z: 10 }

getメソッドは属性を返すため、属性を直接使用することで、メソッド呼び出しを回避できます。

また、最近のコンパイラは、この連結をStringBuilder自動的に最適化します。

詳細については、この投稿を確認してください。

お役に立てば幸いです

于 2013-03-25T12:37:54.467 に答える
0
public String toString() {
    String result = this.x+ "," + this.y + "," + this.z;
    return result;      
}

上記のようなコードを使用してください。

于 2013-03-25T12:38:37.980 に答える
0

メソッドtoStringpublic String toString()[引数なし]である必要があります。これは、Objectクラスからオーバーライドされることを意味します。

そうする場合は、次のことを行うことができます。System.out.println(point);

于 2013-03-25T12:39:00.380 に答える
0

オーバーライド/実装されたメソッドの場合は、@Overrideアノテーションを使用します。これにより、誤ってパラメーター化されたtoStringでエラーが発生します。

さらに、toStringでゲッターを使用しないことはより意味があります。

printlnまたはString連結では、Object.toStringが自動的に呼び出されます。明示的に呼び出さないでください(それを示すため)。

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("Point3D(").append(x).append(", ")
        .append(y).append(", ").append(z).append(")";
    return sb.toString();
}
于 2013-03-25T12:40:30.407 に答える