中南大学计算机学院实验报告
课程名称 Java面向对象程序设计SSD3
实验项目名称 实验4《面向对象——继承》
学生姓名 Xi_Chen123 专业班级 ******班 学号 **********
实验成绩 日期
实验学时: 2
每组人数: 1
实验类型: 1 (1:基础性 2:综合性 3:设计性 4:研究性)
实验要求: 1 (1:必修 2:选修 3:其它)
实验类别: 2 (1:基础 2:专业基础 3:专业 4:其它)
- 实验目的
- 理解面向对象编程,尤其是继承的思想,学习通过继承,在父类的基础上创建子类
- 使用关键字super调用父类的构造方法和方法
- 在子类中覆盖方法
二、实验内容
1. (P380, 11.1)【三角形类Triangle】设计一个名为Triangle的类来扩展GeometricObject类。该类包括:
(1)三个名为side1、side2和side3的double数据域表示这个三角形的三条边,它们的默认值是1.0。
(2)一个无参构造方法创建默认的三角形。
(3)一个能创建带指定side1、side2和side3的三角形的构造方法。
(4)所有三个数据域的访问器方法。
(5)一个名为getArea()的方法返回这个三角形的面积。计算三角形面积的公式参见实验1练习题2.19。
(6)一个名为getPerimeter()的方法返回这个三角形的周长。
(7)一个名为toString()的方法返回这个三角形的字符串描述,显示三角形的三边长、周长及面积。
目标输出任务:
- 画出Triangle类和GeometricObject类的UML图。
- 实现这些类。
- 编写一个测试程序,创建边长为1、1.5和1,颜色为yellow,filled为true的Triangle对象,然后显示它的三边长、周长、面积、颜色以及是否被填充。
2. (P342, 10.11)【Circle2D类】定义Circle2D类,包括:
(1)两个带有get方法的名为x和y的double型数据域,表明圆的中心点。
(2)一个带get方法的数据域radius。
(3)一个无参构造方法,该方法创建一个(x,y)值为(0, 0)且radius为1的默认圆。
(4)一个构造方法,创建带指定的x、y和radius的圆。
(5)一个返回圆面积的方法getArea()。
(6)一个返回圆周长的方法getPerimeter()。
(7)如果给定的点(x, y)在圆内,那么方法contains(double x, double y)返回true。如图a所示。
(8)如果给定的圆在这个圆内,那么方法contains(Circle2D circle)返回true。如图b所示。
(9)如果给定的圆和这个圆重叠,那么方法overlaps(Circle2D circle)返回true。如图c所示。
目标输出任务:
- 画出该类的UML图。
- 实现这个类。
- 编写测试程序,创建一个Circle2D对象c1(new Circle2D(2, 2, 5.5)),显示它的面积和周长,还要显示c1.contains(3, 3)、c1.contains(new Circle2D(4, 5, 10.5))和c1.overlaps(new Circle2D(3, 5, 2.3))。
要求每个学生独立完成实验任务。
四、实验报告
1.在一周内完成本项目实验,在可视化平台上提交实验文档,包括:.java文件(分别对应以上2道题,不需要.class文件)打包成一个名为“实验4”的.rar或.zip文件,以及实验报告1份(格式与要求见下),报告命名为“班级名(如“2101”)_学号_姓名_实验4.doc”。
2. 实验结果与分析
(包括UML图、运行结果截图等)
实验一
实验二
3. 心得体会
(记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。)
本次实验主要内容为面向对象的思想与继承关系的编写。整体难度较为简单,编写过程较为顺利,并没有遇到太多的困难和阻碍。
在编写实验一的过程中,最重要的一点就是要将Triangle类与GeometricObject类形成继承的关系,需要在类名后面使用extends关键字进行类的继承。其次在Triangle类中需要覆盖父类中的toString方法,这样在调用Triangle类中的对象时就可以输出我们需要的语句。如果要调用父类中被覆盖的toString方法,需要使用super关键字。最后在方法的编写过程中,一定要注意所有的分支语句末尾都需要有返回值,否则编译器会报错。在求面积和求周长的方法中,如果三边无法构成三角形的时候,返回值为-1,是一个不可能出现的数值,在toString方法中可以直接返回报错语句。
在编写实验二的过程中,首先需要定义一个常量PI,在java中需要对变量使用static关键字修饰,常量的作用是定义一个无法被修改的量,在以后的使用中可以直接使用常量的标识符来表达一些复杂的数据。和实验一一样,如果题目要求在创建对象的过程中需要为对象赋默认值,则我们需要在无参构造方法中用“this.x=n”来为对象赋默认值。在判断“该圆是否在给定圆之内”的过程中,隐含了一个隐藏条件:需要首先判断该圆的半径是否大于给定圆,如果大于等于,那么该圆不可能在给定圆之内。
4.【附源程序】(除了单独的.java文件,也请复制到实验文档里,方便批阅者评阅)
实验一
GeometricObject类
package com.xc4.exercise2;
public class Circle2D {
private double x;
private double y;
private double radius;
public static double PI=3.14;
public Circle2D() {
this.x=0;
this.y=0;
this.radius=1;
}
public Circle2D(double x,double y,double radius){
this.x=x;
this.y=y;
this.radius=radius;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public double getRadius() {
return radius;
}
public double getArea(){
return PI*radius*radius;
}
public double getPerimeter(){
return 2*PI*radius;
}
public boolean contains(double x, double y){
double d=Math.sqrt(Math.pow(this.x-x,2)+Math.pow(this.y-y,2));
return d < this.radius;
}
public boolean contains(Circle2D c){
if(this.radius<c.getRadius()) {
return false;//若该圆比本圆半径大,直接返回false
}
double d = Math.sqrt(Math.pow(this.x - c.getX(), 2) + Math.pow(this.y - c.getY(), 2));
return d <= this.radius - c.getRadius();
}
public boolean overlaps(Circle2D c){
double d=Math.sqrt(Math.pow(this.x-c.getX(),2)+Math.pow(this.y-c.getY(),2));
return d > this.radius - c.getRadius() & d < this.radius + c.getRadius();
}
}
Triangle类
package com.xc4.exercise1;
import java.text.DecimalFormat;
public class Triangle extends GeometricObject {
private double side1;
private double side2;
private double side3;
public Triangle(){
this.side1=1.0;
this.side2=1.0;
this.side3=1.0;
}
public Triangle(double side1,double side2,double side3){
this.side1=side1;
this.side2=side2;
this.side3=side3;
}
public double getSide1(){
return side1;
}
public double getSide2(){
return side2;
}
public double getSide3(){
return side3;
}
public double getArea(){
double s=(side1+side2+side3)/2;
double result=s*(s-side1)*(s-side2)*(s-side3);
if(result>0){
return Math.sqrt(result);
}else
return -1;
}
public double getPerimeter(){
if(getArea()>0){
return side1+side2+side3;
}else {
return -1;
}
}
@Override
public String toString(){
DecimalFormat df=new DecimalFormat("0.000");
if(getArea()>0){
return "sides:"+getSide1()+", "+getSide2()+", "+getSide3()+"\n"+"area:"+df.format(getArea())+"\n"+"perimeter:"+getPerimeter()+"\n"+super.toString();
}else {
return "creat on null";
}
}
}
TriangleDemo类
package com.xc4.exercise1;
public class TriangleDemo {
public static void main(String[] args) {
Triangle t=new Triangle(1,1.5,1);
t.setColor("yellow");
t.setFilled(true);
System.out.println(t.toString());
}
}
实验二
Circle2D类
package com.xc4.exercise2;
public class Circle2D {
private double x;
private double y;
private double radius;
public static double PI=3.14;
public Circle2D() {
this.x=0;
this.y=0;
this.radius=1;
}
public Circle2D(double x,double y,double radius){
this.x=x;
this.y=y;
this.radius=radius;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public double getRadius() {
return radius;
}
public double getArea(){
return PI*radius*radius;
}
public double getPerimeter(){
return 2*PI*radius;
}
public boolean contains(double x, double y){
double d=Math.sqrt(Math.pow(this.x-x,2)+Math.pow(this.y-y,2));
return d < this.radius;
}
public boolean contains(Circle2D c){
if(this.radius<c.getRadius()) {
return false;//若该圆比本圆半径大,直接返回false
}
double d = Math.sqrt(Math.pow(this.x - c.getX(), 2) + Math.pow(this.y - c.getY(), 2));
return d <= this.radius - c.getRadius();
}
public boolean overlaps(Circle2D c){
double d=Math.sqrt(Math.pow(this.x-c.getX(),2)+Math.pow(this.y-c.getY(),2));
return d > this.radius - c.getRadius() & d < this.radius + c.getRadius();
}
}
Circle2Ddemo类
package com.xc4.exercise2;
public class Circle2DDemo {
public static void main(String[] args) {
Circle2D c1=new Circle2D(2,2,5.5);
//显示面积和周长
System.out.println("c1的面积为:"+c1.getArea());
System.out.println("c1的周长为:"+c1.getPerimeter());
if(c1.contains(3,3)){
System.out.println("(3,3)在c1内部");
}else{
System.out.println("(3,3)在c1外部");
}
Circle2D c2=new Circle2D(4,5,10.5);
Circle2D c3=new Circle2D(3,5,2.3);
if(c1.contains(c2)) {
System.out.println("c2在c1内部");
}else {
System.out.println("c2不在c1内部");
}
if(c1.overlaps(c3)){
System.out.println("c3与c1重叠");
}else{
System.out.println("c3不与c1重叠");
}
}
}