我们继续学习类与对象,上一篇我们定义了  坐标类(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. }
  1. 圆类(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. String str ;
  21. switch (c1.position(c2)){
  22. case 1:
  23. str = "外离 ";
  24. break;
  25. case 2:
  26. str = "外切" ;
  27. break;
  28. case 3:
  29. str = "相交";
  30. break;
  31. case 4:
  32. str = "内切";
  33. break;
  34. case 5:
  35. str = "内含";
  36. break;
  37. default:
  38. str = " 0.0 ";
  39. }
  40. System.out.printf("两个圆的位置关系为%s :",str);
  41. System.out.println();
  42. }
  43. }

测试结果:

  1. 收获总结:因为我们在Point类里面的初始化不是用的构造函数,在Circle类的构造函数要不断的 创建一个坐标(Point)对象(即new 一个Point
    所以我决定我把Point 初始化方法 init() 也改为 构造函数
    Point 修改如下:
    把函数init 的函数名换位 Point(即类名)
  2.  
  3. 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. }
  1. Test函数因为 构造函数发生了改变,也随之发生了改变;
  1. //c3我们设置为 圆心(0,0) 半径为6
  2. Point p = new Point(0,0); // 调用第三种 ,两个参数 p r
  3. Circle c3 = new Circle(p,6);

构造函数,就是在新建一个对象时(即new一个对象的时候)直接赋值。

  1.  

java学习-初级入门-面向对象④-类与对象-类与对象的定义和使用2的更多相关文章

  1. java学习-初级入门-面向对象③-类与对象-类与对象的定义和使用1

    今天学习类与对象.先大致解释一下类与对象的含义. 对象:object 有物体这一概念,一切皆对象(物体),对象由静态的属性和动态的行为组成. 比如说水杯: 水杯的静态属性:材质,容量,质量,颜色 动态 ...

  2. java学习-初级入门-面向对象②-面向对象概述-面向对象程序设计

    我们在  面向对象①中学习了,结构化程序设计. 今天我们一起学习面向对象程序设计. 学习面向对象程序设计就要了解,在面向对象中重要的知识点. 继承  .  多态   . 抽象  . 接口 我们会在接下 ...

  3. java学习-初级入门-面向对象⑤-类与对象-类与对象的定义和使用3

    这次我们要做一个日期类Date类 主要目的是    1.  熟悉-->构造不同参数的函数  2.善于利用已有的函数!! 题目要求: Date类要求 可设定年月日 可转换为字符串,并可指定分隔符, ...

  4. java学习-初级入门-面向对象⑥-类与对象-静态static

    这次我们来学习静态(static) 知识点 1.静态方法只能调用静态变量 2.静态变量属于整个Class,会随着发生变化. 案例:定义一个自动增长的学生类. 题目要求: 定义一个学生类,除了姓名.性别 ...

  5. java学习-初级入门-面向对象①-面向对象概述-结构化程序设计

    为了学习面向对象程序设计,今天我们先利用面向对象以前的知识,设计一个学生类. 要求进行结构化程序设计. 学生类: Student 要求:存储学生的基本信息(姓名.性别.学历层次和年级),实现学生信息的 ...

  6. Java学习笔记之---面向对象

    Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...

  7. Java学习日记基础篇(四)——类,对象之成员变量,成员方法,构造方法

    面向对象(Object Oriented) 一.面向对象杂谈 面向对象(Object Oriented),我的翻译是以物体为目标的,就是说编程的时候是建立一个物体,然后对这个物体进行操作. Java语 ...

  8. 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器

    Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...

  9. Java精选笔记_面向对象(慨念、类和对象)

    面向对象概念 在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象. 相对于面向过程而言.是一种思想,强调的是功能的对象. 面向对象的本质:以类的方式组织代码, ...

随机推荐

  1. windows10 通过ssh访问 linux

    安装openssh服务 Win10其实自带OpenSSH 没有的话,点击上面的添加找到并安装 在服务里设置对应服务开机启动 添加服务器到已知主机 ssh-keygen -R 你的服务器ip 连接Lin ...

  2. [LeetCode] 735. Asteroid Collision

    行星碰撞. 题意是给一个数组 asteroids,表示在同一行的行星.对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动).每一颗行星以相同的速度移 ...

  3. h5页面判断移动端系统为Android或IOS

    最近遇到了一个需求,即所谓的 app+web 混合开发,需要将 h5 内嵌到 APP 中,这个时候因为要对 Android 和 IOS 有不同的处理逻辑,所以我们就需要判断一下,移动端的系统到时是哪一 ...

  4. 【转载】Linux截图工具

    如果linux安装了gnome,那么系统自带了一款截屏软件 gnome-screenshot,使用起来很方便,功能齐备,支持命令行.简单介绍如下. 功能 对屏幕,窗口,或自定义的区域进行截图. 选项 ...

  5. 关于calendar修改前的代码和修改后的代码

    Java编写的日历,输入年月,输出这个月的日期与星期 修改前的代码: import java.io.BufferedReader; import java.io.IOException; import ...

  6. 【PAT甲级】1060 Are They Equal (25 分)(需注意细节的模拟)

    题意: 输入一个正整数N(<=100),接着输入两个浮点数(可能包含前导零,对于PAT已经习惯以string输入了,这点未知),在保留N位有效数字的同时判断两个数是否相等,并以科学计数法输出. ...

  7. 【PAT甲级】1042 Shuffling Machine (20 分)

    题意: 输入洗牌次数K(<=20),输入54张牌每次洗入的位置(不是交换的位置),输出洗好的牌. AAAAAccepted code: #define HAVE_STRUCT_TIMESPEC ...

  8. 5G时代开启,这些新兴职业决定你的后半生

    近段时间,高考志愿填报成为牵动千万家庭的头等大事.事实上,除了学校间的差距外,专业的优劣也在很大程度上决定着人们未来职场生涯的潜力.血淋淋的事实告诉我们,只有选对专业,才能让自己的人生实现升华,并避免 ...

  9. 简单bat脚本

    hwf.bat: set GAP_HOME=%~dp0\.. ::copy "%JAVA_HOME%\bin\javaw.exe" "%JAVA_HOME%\bin\HW ...

  10. Linux 命令中 more、less、head、tail 命令的用法

    more 命令 more 命令,功能类似 cat ,cat 命令是将整个文件的内容从上到下显示在屏幕上. more 命令会一页一页的显示,方便使用者逐页阅读,而最基本的指令就是按空白键(space)往 ...