Java实验四 继承

中南大学计算机学院实验报告

课程名称           Java面向对象程序设计SSD3                       

实验项目名称       实验4《面向对象——继承》                 

学生姓名  Xi_Chen123  专业班级  ******班  学号   **********  

实验成绩                             日期                      

实验学时:  2   

每组人数:  1   

实验类型:  1  (1:基础性  2:综合性   3:设计性  4:研究性)

实验要求:  1  (1:必修   2:选修      3:其它)

实验类别:  2  (1:基础   2:专业基础  3:专业    4:其它)

  • 实验目的
  1. 理解面向对象编程,尤其是继承的思想,学习通过继承,在父类的基础上创建子类
  2. 使用关键字super调用父类的构造方法和方法
  3. 在子类中覆盖方法

二、实验内容

   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重叠");

        }

    }

}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值