在第九章中,我们将学习对象。对象最基本的形式是由成员变量或紧密相关的数据项组成。
这是上节课的一个例子,重写为使用简单对象。最接近点的例子是这种方法的自然候选者,因为一个点是一对坐标。
下面是一个简单的Point类的声明,我们可以用它来表示点。每个点包含两个数据成员,即存储该点坐标的变量x和y。
public class Point {public double x;Public双y;public Point(双x,双y) {this。X = X;这一点。Y = Y;}}
Point类还包含一个特殊的方法,称为构造函数,用于从调用者提供的一对值初始化成员变量x和y。
这里现在是最近的点的例子重写,以使用点对象。通过将程序中的数据重组为Point对象列表,我们不再需要使用二维数组来存储点数据。
/** *从points.txt中读取1000个点。*/ public static Point[] readPoints() {Point A[] = new Point[1000];扫描器输入= null;try {input = new Scanner(new File("points.txt"));} catch(异常ex) {System.out。println(“无法打开文件”);system . exit (1);} for (int p = 0;P < 1000;p++) {double x = input.nextDouble();double y = input.nextDouble();A[p] = new Point(x,y);}返回A;} /** *计算两个点(x1, y1)和(x2, y2)之间的距离*/公共静态双距离(点1,点2){返回Math.sqrt((2。X - 1 . X) * (2)X - 1 (X) + (2)Y - 1 Y) * (2)Y - 1 . Y);}公共静态void main(String[] args) {Point points[] = readPoints();// p1和p2是point数组的下标int p1 = 0, p2 = 1;//初始两点double shortestDistance =距离(points[p1],points[p2]);//初始化shortestDistance //计算每两个点的距离(int i = 0;I < points.length;I ++) {for (int j = I + 1;J < points.length;j++) {double distance = distance(points[i],points[J]);//查找距离如果(shortestDistance >距离){p1 = i;//更新p1 p2 = j;//更新p2 shortestDistance =距离;//更新shortestDistance}}} //显示结果System.out。最近的两个点是“+”(“+ points[p1]”)。X +“,”+点[p1]。Y + ")和(" + points[p2]。X + ", " +点[p2]。Y + ")");}}
关于这段代码,有一些重要的区别需要注意。
新
命令。除了成员变量和构造函数,类还可以包含方法。为了展示这方面的一个例子,下面是Point类的一个更新版本,它向该类添加了一个方法。
public class Point {public double x;Public双y;public Point(双x,双y) {this。X = X;这一点。Y = Y;}公共空print () {System.out.print(“(”+ x +”,“+ y +”)”);}}
我在Point类中添加了一个print()方法,使Points能够打印自己。这里有一些关于这个方法的注意事项。
将print()方法添加到Point类之后,可以重写main方法中打印结果的代码。为了替换原来的print语句,我们现在可以这样做:
//显示结果System.out。print(“最接近的两个点是”);点(p1) .print ();system . out。Print (" and ");点(p2) .print ();System.out.println ();
这段代码展示了如何调用非静态方法。要调用这样的方法,您必须首先确定要调用该方法的对象。接下来,输入一个点。点之后调用想要调用的方法。在上面的代码中,您可以看到我们对存储在Point数组中的几个Point对象调用print()方法。