我们继续学习类与对象,上一篇我们定义了 坐标类(Point),
这次我们在Point的基础上,创建一个圆类(Circle).
案例:创建一个圆类
题目要求:
计算圆的周长和面积;求判断两个圆的位置关系,①两圆外离 d>R+r ②两圆外切 d=R+r
③两圆相交 R-r<d<R+r(R>r) ④两圆内切 d=R-r(R>r) ⑤两圆内含d<R-r(R>r)
解题思路:
1.圆的属性:圆心(用一个坐标来表示),半径
2.计算周长函数 perimeter
3.计算面积函数 area
4.判断两个圆的位置关系
5.进行测试
代码设计:
Point类(上次我们有一个测试函数,去掉or不去掉都可以,测试函数跟我们这次案例无关,但也不影响运行)
1 public class Point { 2 private double x; //成员变量 3 private double y; 4 5 /** 6 * 初始化方法 7 * @param x 横坐标 8 * @param y 纵坐标 9 */ 10 public void init(double x,double y){ 11 this.x = x; 12 this.y = y; 13 } 14 15 /** 16 * @param p 计算距离的两个点之一(因为这个类自己本身就是一个坐标,所以调用 类自己的距离函数 的时候,只需要加入要比较的坐标即可) 17 * @return 距离 18 */ 19 public double distance(Point p){ 20 return Math.sqrt(Math.pow((p.x-this.x),2)+Math.pow((p.y-this.y),2)); // 当前对象 p1.distance(p2)) this 表示的是 p1 21 } 22 23 }
圆类(Circle)(这个类里面有三个构造函数,构造函数的使用,是根据参数的不同)
构造函数,就是在新建一个对象时(即new一个对象的时候)直接赋值。
第一个构造函数没有参数
第二个构造函数 三个参数 r x y
第三个构造函数 两个参数 p(坐标) r(半径),这个构造函数在调用的时候就需要,把p坐标初始化(即坐标的初始化函数init())
其余的函数比较普通。
判断圆的位置关系时我们返回的byte值,在测试函数中根据返回值 来确定位置关系:1-外离 2-外切 3-相交 4-内切 5-内离
1 public class Circle { 2 private double r; 3 private Point p;// 圆心 4 5 /** 6 * 构造函数1,无参,直接进行赋值 7 */ 8 public Circle() { 9 p = new Point(); 10 p.init(3,4); 11 r = 1; 12 System.out.println("第一个构造函数被自动调用了"); 13 } 14 15 /** 16 * 构造函数2,三个参数 17 * @param r 初始化半径r 18 * @param x 初始化横坐标x 19 * @param y 初始化纵坐标y 20 */ 21 public Circle(double r, double x,double y){ 22 Point p = new Point(); 23 p.init(x,y); 24 this.p = p; 25 this.r = r; 26 System.out.println("第二个构造函数被自动调用了"); 27 } 28 29 /** 30 * 构造函数(constructor) 31 * @param p 定义一个坐标 32 * @param r 初始化半径 33 */ 34 public Circle(Point p, double r){ 35 this.p = p; 36 this.r = r; 37 System.out.println("第三个函数被调用了!"); 38 } 39 40 /** 41 * 求面积 42 * @return 返回面积 43 */ 44 public double area( ){ 45 return Math.PI*r*r; 46 } 47 48 /** 49 * 求周长 50 * @return 返回周长 51 */ 52 public double perimeter( ){ 53 return Math.PI*r*2; 54 } 55 56 /** 57 * 判断当前圆与另一个圆的位置关系。 1-外离 2-外切 3-相交 4-内切 5-内离 58 * @param circle 59 * @return 60 */ 61 public byte position(Circle circle){ 62 double dis = this.p.distance(circle.p); // 两个圆心的距离 63 double sumOfR = this.r + circle.r; // 半径和的距离 64 double subOfR = Math.abs(this.r-circle.r); 65 66 if (dis>sumOfR){ 67 return 1; 68 } 69 if (Math.abs(sumOfR-dis)<1e-6) { 70 return 2; 71 } 72 if (dis>subOfR&&dis<sumOfR){ 73 return 3; 74 } 75 if (Math.abs(dis-subOfR)<1e-6){ 76 return 4; 77 } 78 if (dis <subOfR){ 79 return 5; 80 } 81 return 0; 82 } 83 }
测试类 Test 进行测试(大家可以更改数据进行测试)
1 public class Test { 2 public static void main(String[] args) { 3 // c1我们在Circle中设置为: 半径 1, 圆心(3,4) 4 Circle c1 = new Circle(); // 调用第一种无参构造函数 5 6 //c2我们设置为: 圆心(0,0),半径为4 7 Circle c2 = new Circle(4,0,0);//调用第二种构造函数,三个参数 r x y 8 9 //c3我们设置为 圆心(0,0) 半径为6 10 Point p = new Point(); // 调用第三种 ,两个参数 p r 11 p.init(0,0); 12 Circle c3 = new Circle(p,6); 13 14 System.out.println("c1的周长是: "+c1.perimeter()); 15 System.out.println("c1的面积是: "+c1.area()); 16 17 System.out.println("c2的周长是: "+c2.perimeter()); 18 System.out.println("c2的面积是: "+c2.area()); 19 20 21 String str ; 22 switch (c1.position(c2)){ 23 case 1: 24 str = "外离 "; 25 break; 26 case 2: 27 str = "外切" ; 28 break; 29 case 3: 30 str = "相交"; 31 break; 32 case 4: 33 str = "内切"; 34 break; 35 case 5: 36 str = "内含"; 37 break; 38 default: 39 str = " 0.0 "; 40 } 41 System.out.printf("两个圆的位置关系为%s :",str); 42 System.out.println(); 43 } 44 }
测试结果:
收获总结:因为我们在Point类里面的初始化不是用的构造函数,在Circle类的构造函数要不断的 创建一个坐标(Point)对象(即new 一个Point)
所以我决定我把Point的 初始化方法 init() 也改为 构造函数。
Point类 修改如下:
把函数init 的函数名换位 Point(即类名)
Ciecle类修改如下:(修改了构造函数1,和构造函数2,修改后的代码如下)
1 /** 2 * 构造函数1,无参,直接进行赋值 3 */ 4 public Circle() { 5 Point p = new Point(3,4); 6 this.p = p; 7 r = 1; 8 System.out.println("第一个构造函数被自动调用了"); 9 } 10 11 /** 12 * 构造函数2,三个参数 13 * @param r 初始化半径r 14 * @param x 初始化横坐标x 15 * @param y 初始化纵坐标y 16 */ 17 public Circle(double r, double x,double y){ 18 Point p = new Point(x,y); 19 this.p = p; 20 this.r = r; 21 System.out.println("第二个构造函数被自动调用了"); 22 }
Test函数因为 构造函数发生了改变,也随之发生了改变;
1 //c3我们设置为 圆心(0,0) 半径为6 2 Point p = new Point(0,0); // 调用第三种 ,两个参数 p r 3 Circle c3 = new Circle(p,6);
构造函数,就是在新建一个对象时(即new一个对象的时候)直接赋值。