带对象的构造函数

时间:2013-01-04 17:09:25

标签: java constructor

我的代码处理两个类: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());

string 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方法合法吗?

感谢您的回答。

2 个答案:

答案 0 :(得分: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我对如果Point发生变化(+1来自我)会发生什么有好处。解决这个问题的一个简单方法是使点和线不可变。

toString方法也没关系。 p1p2是实例变量,如果没有带有这些名称的局部变量或参数,则编译器会查找具有匹配名称的实例变量。

答案 1 :(得分: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);

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

这只会复制一行