2

私のコードは、Point と Line の 2 つのクラスを扱います。直線は 2 つの点で構成されます:

import java.util.Scanner;

public class Line {
Scanner scan = new Scanner (System.in);
private Point p1,p2;

public Line(int x1, int x2, int y1, int y2){
    p1=new Point(x1,y1);
    p2=new Point (x2,y2);

ここでコンストラクターを作成する必要がありますが、エイリアシングのためにこのコードは合法ではありません。

public Line (Point p1, Point p2){
    this.p1=p1;
    this.p2=p2; 
    Line a1=new Line (p1.getX(),p1.getY(),(p2.getX()),p2.getY());

文字列 toString メソッド:

public String toString()
{
    return "Line between: (" +  p1 + p2 + ")"; 
}

主なものは次のとおりです。

Point a=new Point (1,2);
    Point b=new Point (2,3);
    Line x=new Line(a,b);
    System.out.println(a);
    System.out.println(b);
    System.out.println(x);

ここでの出力は正常に出力されますが、私の質問は次のとおりです。1) コンストラクターは問題ありませんか? エイリアシングの原因ですか?2) String toString メソッドは合法ですか?

答えてくれてありがとう。

4

2 に答える 2

3

コンストラクターを次のように変更する必要があります。

public Line (Point p1, Point p2){
    this(p1.getX(),p1.getY(),(p2.getX()),p2.getY());
}

ローカルa1変数は意味がありません (以前に指摘したように)。

実際には、コンストラクターの呼び出し方法を変えて、メイン コンストラクターをポイントを持つコンストラクターにすることができます。それはそれを次のように単純化します:

public Line(Point p1, Point p2) {
    this.p1 = p1; this.p2 = p2;
}

public Line(int x1, int y1, int x2, int y2) {
    this(new Point(x1, y1), new Point(x2, y2);
}

Sam I am は、ポイントが変更された場合に何が起こるかについて良い点を述べています (+1 from me)。これに対処する簡単な方法の 1 つは、ポイントとラインを不変にすることです。

また、toString メソッドも問題ありません。p1およびp2はインスタンス変数です。これらの名前を持つローカル変数またはパラメーターが存在しない場合、コンパイラは一致する名前を持つインスタンス変数を探します。

于 2013-01-04T17:15:57.527 に答える
3

コンストラクターが大丈夫かどうかは、1つの部分を除いて要件に依存します

Line a1=new Line (p1.getX(),p1.getY(),(p2.getX()),p2.getY());

そのコード行に目的がある場合、その目的はおそらくサンプルから除外されa1ます。これは、何かを行わない限り、コンストラクターが終了すると範囲外になるためです。


コンストラクターが行うことは、メインで宣言したポイントを取得し、それらを に配置することですLine x。あなたが何かをするなら

Line x=new Line(a,b);
Line y=new Line(a,b);

よりもLine y同じポイントがLine xあり、一方のポイントの値を変更すると、もう一方のポイントも変更されます。

今、あなたがそれについて心配しているなら、あなたは次のようなことができます

public Line (Point p1, Point p2){
    this.p1=new Point(p1.getX(), p1.getY);
    this.p2=new Point(p2.getX(), p2.getY); 
    ...

そして、それは行のコピーを作成するだけです

于 2013-01-04T17:16:09.073 に答える