java类的继承实验报告

实验四 类的继承

1.实验目的

  1. 掌握(继承)类的声明;
  2. 掌握构造方法执行机理;
  3. 掌握private、protected、public等修饰符;
  4. 掌握super的各种用法;
  5. 掌握重载;
  6. 掌握重写;
  7. 基于抽象的编程及上转型的使用;

2. 实验题1

1. 实验内容

定义一个圆类Circle,成员变量:圆心,半径;
成员方法:构造方法、get和set半径的方法、计算面积和周长的方法。
定义圆柱和圆锥类,定义相应的变量成员和成员方法。
使用以上类编程,输出圆柱和圆锥面积和体积。

2.实验思路

Circle double r Circle() Circle(double r) getArea() getAround() getR() setR() Circle_Column h Circle_Column() getV() getArea() setH() getH() Circle_Cone h Circle_Cone() Circular_Cone(double r , double l) getH() setH() getV() getArea() Test Scanner sc Circle c1 Circle c2 main() extends extends

3. 代码

  1. Circle类
package edu.moth10.Circledemos;

public class Circle {
    public double r;
    public Circle(){
        System.out.println("创建了一个圆");
    }

    public Circle(double r){
        this.r =r;
        System.out.println("创建了一个圆");
    }

    public double getR(){
        return r;
    }

    public void setR(double r){
        this.r = r;
    }

    public double getArea(){
        double area;
        area = Math.PI*r*r;
        return area;
    }

    /**
     * 周长是圆的特有属性,故计算周长这个方法不允许被继承
     * @return
     */
    public final double getAround(){
        double around;
        around = 2*Math.PI*r;
        return around;
    }

}

  1. Circle_Column类
package edu.moth10.Circledemos;

public class Circle_Column extends Circle{
    private double h;

    public Circle_Column(double h,double r){
    /**
    *super()用于调用父类的构造方法,在Java中并不是所有的方法
    *都会被继承的,例如构造方法,private修饰的方法以及final修
    *饰的方法是不能被继承的
    */
    	super();
        this.h = h;
        this.r = r;
        System.out.println("创建了一个圆柱");
    }

    public double getH(){
        return h;
    }

    public void setH (double h){
        this.h = h;
    }
@Override
    public double getArea(){
        double area;
        area = 2*Math.PI*r*r+Math.PI*r*h;
        return area;
    }

    public double getV(){
        double V;
        V = Math.PI*r*r*h;
        return V;
    }
}

  1. Circle_Cone类
package edu.moth10.Circledemos;

public class Circular_Cone extends Circle{
    private double h;

    public Circular_Cone(double h , double r){
    	super();
        this.h = h;
        this.r = r;
        System.out.println("创建了一个圆锥");
    }

    public double getH(){
        return h;
    }

    public void setH (double h){
        this.h = h;
    }

    public double getV(){
        double V;
        V = Math.PI*r*r*h/3;
        return V;
    }
@Override
    public double getArea(){
        double area;
        area = Math.PI*r*r+Math.PI*r*Math.hypot(r, h);
        return area;
    }


}
  1. Test类
package edu.moth10.Circledemos;

import java.util.Scanner;

public class Test {
    public static void main(String argvs[]){
        Scanner sc = new Scanner(System.in);
        Circle c1 = new Circle();
        System.out.println("请输入圆的半径:");
        double r = sc.nextDouble();
        c1.setR(r);
        System.out.println("圆的半径是:"+c1.getR());
        System.out.println("圆的面积是:"+c1.getArea());
        System.out.println("圆的周长是:"+c1.getAround());

        Circle c2 = new Circle(3.0);
        System.out.println("圆的半径是:"+c2.getR());
        System.out.println("圆的面积是:"+c2.getArea());
        System.out.println("圆的周长是:"+c2.getAround());

        Circle_Column column = new Circle_Column(2,3);
        System.out.println("圆柱的高是:"+column.getH());
        System.out.println("圆柱的半径是:"+column.getR());
        System.out.println("圆柱的体积是:"+column.getV());
        System.out.println("圆柱的表面积是:"+column.getArea());

        Circular_Cone cone = new Circular_Cone(2,3);
        System.out.println("圆锥的高是:"+cone.getH());
        System.out.println("圆锥的半径是:"+cone.getR());
        System.out.println("圆锥的表面积是:"+cone.getArea());
        System.out.println("圆锥的体积是:"+cone.getV());
    }

}

4. 运行结果

在这里插入图片描述

3.思考题

1.实验内容2

定义抽象类Shape表示一般二维图形。Shape具有抽象方法area和perimeter
分别计算形状的面积和周长。试定义一些二维形状类(如矩形、三角形、圆形、椭圆形等),这些类均为Shape类的子类。完成相关类的定义后,定义含有main方法的类来使用这些类的相应对象,输出相关信息:如对象所代表图形形状、基本数据(半径、长宽高等)以及面积、周长等计算值。

2.实验分析

Triangle double a double b double c double a area() perimeter() «abstract» Shape area() perimeter() getInformation() Rectangle double length double width double length area() perimeter() Circle double r area() perimeter() double r Test main() printMenu() extends extends extends

3. 实验代码

  1. Shape类
package edu.moth11.Shape;

public abstract class Shape {
    public abstract double area();
    public abstract double perimeter();
    public abstract void getInformation();
}

  1. Rectangle类
package edu.moth11.Shape;

public class Rectangle extends Shape{
    private double length;
    private double width;

    public Rectangle(double length,double width){
        System.out.println("成功创建了一个矩形");
        this.length = length;
        this.width = width;
    }

    public void getInformation(){
        System.out.println("这个矩形的长为:"+length);
        System.out.println("这个举行的宽为:"+width);
    }
    public  double area(){
       double areaR;
       areaR = length * width;
       return areaR;
    }
    public  double perimeter(){
        double perimeterR = 0;
        perimeterR = 2 * (length + width);
        return perimeterR;
    }
}

  1. Triangle类
package edu.moth11.Shape;

import static java.lang.StrictMath.sqrt;

public class Traingle extends Shape{
    private double a;
    private double b;
    private double c;

    public Traingle(double a, double b, double c){
        System.out.println("成功创建了一个三角形");
        this.a = a;
        this.b = b;
        this.c = c;
    }
    public void getInformation(){
        System.out.println("这个三角形的三条边分别为:"+a+"   "+b+"   "+c);
    }
    @Override
    public double area(){
        double A;
        double p = (a + b + c)/2;
        double D = p*(p-a)*(p-b)*(p-c);
        A = sqrt(D);
        return A;
    }
    @Override
    public double perimeter(){
        double P;
        P = a + b + c;
        return P;
    }
}

  1. Circle类
package edu.moth11.Shape;

import java.util.regex.Matcher;

public class Circle extends Shape{
    private double r;

    public  Circle(double r)
    {
        System.out.println("成功创建了一个圆形");
        this.r = r;
    }
    public void getInformation(){
        System.out.println("这个球的半径为"+ r);
    }
    public double area(){
        double A;
        A = Math.PI*r*r;
        return A;
    }

    public double perimeter(){
        double p;
        p = 2*Math.PI*r;
        return p;
    }
}

  1. Test类包含main方法
package edu.moth11.Shape;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        printMenu();
        Scanner sc = new Scanner(System.in);
        int command;
        double m,n,k;
        while((command = sc.nextInt())>0){
            if(command == 1) {
                System.out.println("请分别输入矩形的长和宽");
                m = sc.nextDouble();
                n = sc.nextDouble();
                Shape s = new Rectangle(m,n);
                s.getInformation();
                System.out.println("矩形的面积为"+s.area());
                System.out.println("矩形的周长为"+s.perimeter());
            }
            else if(command == 2) {
                System.out.println("请分别输入三角形的三条边长:");
                m = sc.nextDouble();
                n = sc.nextDouble();
                k = sc.nextDouble();
                Shape s = new Traingle(m,n,k);
                s.getInformation();
                System.out.println("三角形的面积为"+s.area());
                System.out.println("三角形的周长为"+s.perimeter());
            }
            else if(command == 3) {
                System.out.println("请输入圆的半径:");
                m = sc.nextDouble();
                Shape s = new Circle(m);
                s.getInformation();
                System.out.println("圆形的面积为"+s.area());
                System.out.println("圆形的周长为"+s.perimeter());
            }
            else break;
        }
    }
    public static void printMenu(){
        System.out.println("请选择您要创建的平面集合类型");
        System.out.println("----------------------------");
        System.out.println("1. 矩形");
        System.out.println("2. 三角形");
        System.out.println("3. 圆形");
        System.out.println("输入其他数据退出");
    }
}

4. 运行结果

在这里插入图片描述
在这里插入图片描述

4. 实验报告涉及以下内容

  1. 子类的继承性
  2. 父类中类方法的继承性

并不是父类中所有的方法都可以继承,例如:private修饰的方法不可以继承,final修饰的方法不可以继承,默认方法不可以继承,构造方法不可以继承。

  1. super的应用

当用子类的构造方法来创建一个子类对象时,子类的构造方法总是先调用父类的某个构造方法,子类构造方法没有明显的指明是哪个构造方法时,子类就调用父类不带参数的构造方法
子类不继承父类的构造方法,因此子类在器构造方法中需要使用super来调用父类的构造方法,而且super必须是子类构造方法中的头一条语句,如果子类中没有明显的用super来调用一个构造方法,则默认子类构造方法中的最开始调用了
super();

  1. 父类中构造方法的要求

父类中定义多个构造方法时,应当包括一个不带参数的构造方法,以防子类省略super时出现错误

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值