我的代码处理两个类: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方法合法吗?
感谢您的回答。
答案 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方法也没关系。 p1
和p2
是实例变量,如果没有带有这些名称的局部变量或参数,则编译器会查找具有匹配名称的实例变量。
答案 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);
...
这只会复制一行