7-2 jmu-Java-03面向对象基础-04-形状-继承 --笔记篇

发布时间:2024年01月01日

题目

前言
前面题目形状中我们看到,为了输出所有形状的周长与面积,需要建立多个数组进行多次循环。这次试验使用继承与多态来改进我们的设计。

本题描述
1.定义抽象类Shape
属性:不可变静态常量double PI,值为3.14,
抽象方法:public double getPerimeter(),public double getArea()

2.Rectangle与Circle类均继承自Shape类。
Rectangle类(属性:int width,length)、Circle类(属性:int radius)。
带参构造方法为Rectangle(int width,int length),Circle(int radius)。
toString方法(Eclipse自动生成)

3.编写double sumAllArea方法计算并返回传入的形状数组中所有对象的面积和与
double sumAllPerimeter方法计算并返回传入的形状数组中所有对象的周长和。

4.main方法
4.1 输入整型值n,然后建立n个不同的形状。如果输入rect,则依次输入宽、长。如果输入cir,则输入半径。
4.2 然后输出所有的形状的周长之和,面积之和。并将所有的形状信息以样例的格式输出。 提示:使用Arrays.toString。
4.3 最后输出每个形状的类型与父类型.使用类似shape.getClass() //获得类型, shape.getClass().getSuperclass() //获得父类型;

注意:处理输入的时候使用混合使用nextInt与nextLine需注意行尾回车换行问题。

输入样例:
4
rect
3 1
rect
1 5
cir
1
cir
2

输出样例:
38.84
23.700000000000003
[Rectangle [width=3, length=1], Rectangle [width=1, length=5], Circle [radius=1], Circle [radius=2]]
class Rectangle,class Shape
class Rectangle,class Shape
class Circle,class Shape
class Circle,class Shape

代码

import java.util.*;

abstract class Shape{
    final double PI=3.14;
    // 抽象方法,子类必须实现计算周长和面积的方法
    abstract public double getPerimeter();
    abstract public double getArea();
}

class Rectangle extends Shape {
    int width;
    int length;
    
    // 矩形构造函数,接收宽度和长度作为参数
    Rectangle(int width,int length){
        this.width=width;
        this.length=length;
    }

    // 重写父类的抽象方法,计算矩形周长
    @Override
    public double getPerimeter() {
        return (width+length)*2;
    }

    // 重写父类的抽象方法,计算矩形面积
    @Override
    public double getArea() {
        return width*length;
    }

    // 重写toString方法,以便打印矩形对象信息
    @Override
    public String toString() {
        return "Rectangle [" +
                "width=" + width +
                ", length=" + length +
                ']';
    }
}

class Circle extends Shape{
    int radius;
    
    // 圆形构造函数,接收半径作为参数
    Circle(int radius){
        this.radius=radius;
    }

    // 重写父类的抽象方法,计算圆形周长(圆周率乘以直径)
    @Override
    public double getPerimeter() {
        return 2*radius*PI;
    }

    // 重写父类的抽象方法,计算圆形面积(圆周率乘以半径的平方)
    @Override
    public double getArea() {
        return radius*radius*PI;
    }

    // 重写toString方法,以便打印圆形对象信息
    @Override
    public String toString() {
        return "Circle [" +
                "radius=" + radius +
                ']';
    }
}

public class Main{
    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        
        // 读取形状的数量
        int n= in.nextInt();

        // 创建一个Shape类型的数组来存储不同形状的对象
        Shape shape[]=new Shape[n];
        
        // 初始化总周长和总面积变量
        double all_s=0;
        double all_l=0;

        // 遍历所有输入的形状并创建相应对象
        for (int i=0;i<n;i++){
            String j=in.next();
            
            // 根据用户输入判断创建矩形或圆形对象
            if (j.equals("rect")) {
                int a=in.nextInt(); // 宽度
                int b=in.nextInt(); // 长度
                shape[i]=new Rectangle(a,b);
            } else {
                int a=in.nextInt(); // 半径
                shape[i]=new Circle(a);
            }

            // 计算当前形状的周长和面积,并累加到总和中
            all_s+=shape[i].getArea();
            all_l+=shape[i].getPerimeter();
        }

        // 打印总周长和总面积
        System.out.println(all_l);
        System.out.println(all_s);

        // 打印所有形状的信息
        System.out.print("["+shape[0].toString());
        for (int i=1;i<n;i++) System.out.print(", "+shape[i].toString());
        System.out.println("]");

        // 打印每个形状对象的实际类名及其父类
        for (int i=0;i<n;i++) System.out.println(shape[i].getClass()+",class Shape");
    }
}

笔记

  1. 掌握抽象类的写法
abstract class 类名 {
    // 抽象方法
    abstract 返回类型 方法名(参数列表);

    // 非抽象方法
    返回类型 方法名(参数列表) {
        // 方法体
    }
}
  1. 了解继承 extends 写法
文章来源:https://blog.csdn.net/weixin_52057528/article/details/135297509
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。