我创建了一个类,可以找到两点之间的距离和它们之间的中点值:
public class Point {
private double x;
private double y;
public Point (double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public static void main (String[] args) {
Point p1 = new Point(1,1);
Point p2 = new Point(4,5);
System.out.println("The distance between p1 and p2 is: " + distance(p1, p2));
System.out.println("The midpoint of p1 and p2 is: " + findMidpoint(p1, p2));
}
public static double distance(Point p1, Point p2) {
return Math.sqrt((p1.getX() - p2.getX()) * (p1.getX() - p2.getX()) +
(p1.getY() - p2.getY()) * (p1.getY() - p2.getY()));
}
public static Point findMidpoint (Point p1, Point p2) {
return new Point((p1.getX() + p2.getX()) / 2, (p1.getY() + p2.getY()) / 2);
}
}
这段代码编译得很好,但是当我运行它时,它会输出:
The distance between p1 and p2 is: 5.0
The midpoint of p1 and p2 is: Point@15db9742
无论p1和p2的值如何,它都为中点提供相同的值。我想以“(x,y)”格式输出中点。
有人还能解释为什么我被迫将距离和findMidpoint方法设为静态吗?
答案 0 :(得分:3)
为什么每次都会获得相同的输出?
因为您未覆盖toString
方法。您看到的价值是Java toString
的实现。每个对象都有这种行为。
将此方法放入点类中以覆盖java的toString
实现。
@Override
public String toString(){
return "("+x+", "+y+")";
}
这将按照您的要求为您提供(x, y)
格式的输出。
为什么中点和距离是静止的?
静态方法是一种设计决策。它们可以写成非静态的,但由于这些方法不会改变所涉及的任何一个点对象的状态,所以它会变得不那么有意义。
答案 1 :(得分:2)
您需要创建toString()
方法:
public String toString() {
return String.format("Point(%f,%f)",x,y);
}
然后你得到:
java Point
The distance between p1 and p2 is: 5.0
The midpoint of p1 and p2 is: Point(2.500000,3.000000)
答案 2 :(得分:1)
Point@15db9742
是"默认" Object#toString()
的输出行为。如果要更改它,请覆盖此方法:
@Override
public String toString() {
return "Point[" +
"x=" + x +
", y=" + y +
"]";
}
那应该打印:
Point[x=100.0, y=100.0]
代替。