实验目的:
- 掌握类的定义过程,理解利用类进行封装的意义:定义属性和成员方法,定义构造方法,构造方法重载,this关键字(this前缀,this方法);理解构造方法的作用
- 掌握编写setter和getter方法,理解setter和getter方法的作用
- 掌握对象的创建过程:对象与类的关系,构造方法与对象创建的关系
- 掌握类的组合关系:通过组合定义更为灵活和复杂的类,同时达到代码重用目的
●参考学时:2学时
●基本要求:
- 实现一个Point类,该类包含表示坐标的两个int型变量x、y,构造方法Point()和Point(int x, int y),返回x值和y值的int getX()和int getY()方法,设置x值和y值的void setX(int x)和void setY(int y)方法,计算两点间距离的double distance(Point p)方法。其中计算平方根的方法是Math.sqrt(),如:double d=Math.sqrt(2);
- 实现一个Circle类,该类包含表示圆心的Point型变量center,表示半径的int型变量radius,以及构造方法Circle()、Circle(int x,int y,int r)、Circle(Point c,int r),返回周长和面积的double perimeter()、double area()方法,返回两个圆是否为同一个圆(返回0)、同心圆(返回1)、相交的圆(返回2)、分离的圆(返回3)、包含的圆(返回4)等关系的int relation(Circle c)等方法。π值可以用Math.PI常量。
- 实现测试上述两个类的Test类。该类在main方法中分别创建若干个Point对象和Circle对象,并调用相关方法,输出方法的返回值,验证其正确性。
- 根据relation()方法的返回值,main方法输出“同一圆”、“同心圆”等内容。
●实验提示:
- 同一类对象的属性值不同,对象之间才会有区别,所以创建对象后需要对其属性进行适当赋值,此过程俗称对象的“初始化”。由于对象创建时自动调用构造方法,所以把初始化工作交给构造方法完成更加合理,这就是为什么定义构造方法的原因。
- 为了初始化方便,面向对象技术要求类的编写人员应提供各种构造方法,即运用构造方法重载。其结果是使用该类的其他开发人员可以根据自己的需要决定调用哪一个构造方法。
- 不能在构造方法中编写任何输入输出有关的代码,否则该方法不仅具有初始化功能,还具有其它功能,从而违背Java程序设计的一个重要准则:“单一职责”原则。
- Circle类将圆心定义为Point对象,这种现象称之为类和类之间的“组合关系”(Composition)。利用构造方法初始化Circle对象时,必须实例化center成员对象,以保证此类属性非空,否则将会引起空对象错误。如以下两个构造方法都没有对center实例化:(本讲义中的深色背景文字为示例代码)
Circle(){
radius=0;
}
Circle(int x,int y,int r){
center.x=x;
center.y=y;
radius=r;
}
正确的代码应该是:
Circle(){
center=new Point(0,0);
radius=0;
}
Circle(int x,int y,int r){
center=new Point(x,y);
radius=r;
}
- Circle(Point c,int r)构造方法中,可以把c对象直接赋给center,因为c是调用该构造方法之前实例化的Point对象的引用。
- Test类可以根据relation()方法的返回值显示两个圆的位置关系信息。在relation()方法中不应输出任何信息。
表2.1 测试案例(仅用于编码测试)
编号 | 测试目的 | 输入或测试数据 | 期望结果 |
1 | Point类成员方法 | 创建p1=new Point()和p2=new Point(0,3) | P1.getX()值为0,p1.getY()值为0,p2.getX()值为0,p2.getY()值为3,p1.distance(p2) 值为3 |
2 | Circle()构造方法 | 创建Circle() | 圆心应为(0,0),半径、面积和周长皆为0 |
3 | Circle(int,int,int)构造方法、其它成员方法 | 创建Circle(1,1,10) | 圆心应为(1,1),半径为10,面积为314.159,周长为62.831 |
4 | Circle(int,int,int)构造方法中radius为负数 | 创建Circle(1,1,-1) | 圆心应为(1,1),半径、面积和周长皆为0 |
5 | Circle(Point,int)构造方法 | 利用(1,1)点p创建Circle(p,10) | 圆心应为(1,1),半径为10,面积为314.159,周长为62.831 |
6 | Circle(Point,int)构造方法中radius为负数 | 利用(1,1)点p创建Circle(p,-1) | 圆心应为(1,1),半径、面积和周长皆为0 |
7 | Circle(Point,int)构造方法中Point为空对象 | 创建Circle(null,10) | 圆心应为(0,0),半径为10,面积为314.159,周长为62.831 |
8 | Point类的set方法 | p.setX(10),p.setY(10) | 该点的坐标被变更为(10,10) |
9 | Circle类的set方法 | c.setRadius(20) | 该圆的半径被变更为20 |
10 | Circle类的set方法 | c.setRadius(-20) | 该圆的半径保持不变 |
11 | Circle类的set方法 | c.setCenter(new Point(20,20)) | 该圆的圆心被变更为(20,20)点 |
12 | Circle类的set方法 | c.setCenter(null) | 该圆的圆心保持不变 |
13 | relation方法 | 创建Circle()和Circle(0,0,0),并调用relation() | 输出“同一圆” |
14 | relation方法 | 创建Circle()和Circle(0,0,1) 并调用relation() | 输出“同心圆” |
15 | relation方法 | 创建Circle(0,0,10)和Circle(1,1,5) 并调用relation() | 输出“包含的圆” |
16 | relation方法 | 创建Circle(0,0,10)和Circle(0,5,10) 并调用relation() | “相交的圆” |
17 | relation方法 | 创建Circle(0,0,10)和Circle(0,20,10) 并调用relation() | 输出“分离的圆” |
代码部分
Circle类
package shiyan2;
import static java.lang.Math.*;
public class Circle {
public Point center;
public int radius;
public Circle() {
center = new Point(0, 0);
radius = 0;
}
public Circle(int x, int y, int r) {
center = new Point(x, y);
radius = Math.max(r, 0);
}
public Circle(Point c, int r) {
if (c == null) {
center = new Point();
} else {
center = c;
}
radius = Math.max(r, 0);
}
public void setRadius(int radius) {
this.radius = radius;
}
public int getRadius() {
return radius;
}
public void setCenter(Point center) {
if (center == null) {
this.center = new Point();
} else {
this.center = center;
}
}
public Point getCenter() {
return center;
}
public double perimeter() { //返回圆的周长
return 2 * PI * this.radius;
}
public double area() {
return PI * this.radius * this.radius;
}
public int relation(Circle c) {
if ((this.center.getX() == c.center.getX()) && (this.center.getY() == c.center.getY()) && (radius == c.radius)) {
return 0;
} else if ((this.center.getX() == c.center.getX()) && (this.center.getY() == c.center.getY())) {
return 1;
} else if ((c.center.distance(this.center) < this.radius + c.radius) && (c.center.distance(this.center) > Math.abs(this.radius - c.radius))) {
return 2;
} else if ((this.center != c.center) && (c.center.distance(this.center) >= (this.radius + c.radius))) {
return 3;
} else if ((this.center != c.center) && (c.center.distance(this.center)) <= Math.abs(this.radius - c.radius)) {
return 4;
}
return -1;
}
}
Point类
package shiyan2;
public class Point {
private int x;
private int y;
public Point() {
x = 0;
y = 0;
}
public Point(Point a) {
if (a == null) {
this.x = 0;
this.y = 0;
return;
}
this.x = a.getX();
this.y = a.getY();
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public double distance(Point P) {
return Math.sqrt((this.x - P.x) * (x - P.x) + (this.y - P.y) * (y - P.y));
}
}
Test类
package shiyan2;
public class Test {
public static void main(String[] args) {
System.out.println("-------------分割线1--------------");
Point P1 = new Point();
Point P2 = new Point(0, 3);
System.out.println(P1.getX());
System.out.println(P1.getY());
System.out.println(P2.getX());
System.out.println(P2.getY());
System.out.println(P1.distance(P2));
System.out.println("-------------分割线2--------------");
Circle C1 = new Circle();
System.out.println("圆心" + "(" + C1.center.getX() + "," + C1.center.getY() + ")" + " " + "半径" + C1.radius);
System.out.println("周长为:" + C1.perimeter() + " " + "面积为:" + C1.area());
System.out.println("-------------分割线3--------------");
Circle C2 = new Circle(1, 1, 10);
System.out.println("圆心" + "(" + C2.center.getX() + "," + C2.center.getY() + ")" + " " + "半径" + C2.radius);
System.out.println("周长为:" + C2.perimeter() + " " + "面积为:" + C2.area());
System.out.println("-------------分割线4--------------");
Circle C3 = new Circle(1, 1, -1);
System.out.println("圆心" + "(" + C3.center.getX() + "," + C3.center.getY() + ")" + " " + "半径" + C3.radius);
System.out.println("周长为:" + C3.perimeter() + " " + "面积为:" + C3.area());
System.out.println("-------------分割线5--------------");
Point P = new Point(1, 1);
Circle C4 = new Circle(P, 10);
System.out.println("圆心" + "(" + C4.center.getX() + "," + C4.center.getY() + ")" + " " + "半径" + C4.radius);
System.out.println("周长为:" + C4.perimeter() + " " + "面积为:" + C4.area());
System.out.println("-------------分割线6--------------");
Circle C5 = new Circle(P, -1);
System.out.println("圆心" + "(" + C5.center.getX() + "," + C5.center.getY() + ")" + " " + "半径" + C5.radius);
System.out.println("周长为:" + C5.perimeter() + " " + "面积为:" + C5.area());
System.out.println("-------------分割线7--------------");
Circle C6 = new Circle(null, 10);
System.out.println("圆心" + "(" + C6.center.getX() + "," + C6.center.getY() + ")" + " " + "半径" + C6.radius);
System.out.println("周长为:" + C6.perimeter() + " " + "面积为:" + C6.area());
System.out.println("-------------分割线8--------------");
Point p = new Point();
p.setX(10);
p.setY(10);
System.out.println("p点坐标:" + "(" + p.getX() + "," + p.getY() + ")");
System.out.println("-------------分割线9--------------");
Circle c = new Circle();
c.setRadius(20);
System.out.println(c.radius);
System.out.println("-------------分割线10--------------");
c.setRadius(-20);
System.out.println(c.radius);
System.out.println("-------------分割线11--------------");
c.setCenter(new Point(20, 20));
System.out.println("(" + c.center.getX() + "," + c.center.getY() + ")");
System.out.println("-------------分割线12--------------");
c.setCenter(null);
System.out.println("(" + c.center.getX() + "," + c.center.getY() + ")");
System.out.println("-------------分割线13--------------");
Circle C7 = new Circle();
Circle C8 = new Circle(0, 0, 0);
int a = C7.relation(C8);
if (a == 0) {
System.out.println("同一个圆");
} else if (a == 1) {
System.out.println("同心圆");
} else if (a == 2) {
System.out.println("相交的圆");
} else if (a == 3) {
System.out.println("分离的圆");
} else if (a == 4) {
System.out.println("包含的圆");
}
System.out.println("-------------分割线14--------------");
Circle C9 = new Circle();
Circle C10 = new Circle(0, 0, 1);
int b = C9.relation(C10);
if (b == 0) {
System.out.println("同一个圆");
} else if (b == 1) {
System.out.println("同心圆");
} else if (b == 2) {
System.out.println("相交的圆");
} else if (b == 3) {
System.out.println("分离的圆");
} else if (b == 4) {
System.out.println("包含的圆");
}
System.out.println("-------------分割线15--------------");
Circle C11 = new Circle(0, 0, 10);
Circle C12 = new Circle(1, 1, 5);
int d = C11.relation(C12);
if (d == 0) {
System.out.println("同一个圆");
} else if (d == 1) {
System.out.println("同心圆");
} else if (d == 2) {
System.out.println("相交的圆");
} else if (d == 3) {
System.out.println("分离的圆");
} else if (d == 4) {
System.out.println("包含的圆");
}
System.out.println("-------------分割线16--------------");
Circle C13 = new Circle(0, 0, 10);
Circle C14 = new Circle(0, 5, 10);
int e = C13.relation(C14);
if (e == 0) {
System.out.println("同一个圆");
} else if (e == 1) {
System.out.println("同心圆");
} else if (e == 2) {
System.out.println("相交的圆");
} else if (e == 3) {
System.out.println("分离的圆");
} else if (e == 4) {
System.out.println("包含的圆");
}
System.out.println("-------------分割线17--------------");
Circle C15 = new Circle(0, 0, 10);
Circle C16 = new Circle(0, 20, 10);
int f = C15.relation(C16);
if (f == 0) {
System.out.println("同一个圆");
} else if (f == 1) {
System.out.println("同心圆");
} else if (f == 2) {
System.out.println("相交的圆");
} else if (f == 3) {
System.out.println("分离的圆");
} else if (f == 4) {
System.out.println("包含的圆");
}
}
}
有很多不完美和不足,大家可以指出,共同学习。