2

我的代码处理两个类:Point 和 Line。线由两个点组成:

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);
}

山姆我很好地说明了如果一个点发生变化(我+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除非您对它执行某些操作,否则当构造函数完成时将超出范围。


您的构造函数所做的是获取您在 main 中声明的点,并将它们放入Line x. 如果你做类似的事情

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

thanLine 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 回答