我们继续学习类与对象,上一篇我们定义了  坐标类(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一个对象的时候)直接赋值。