JavaSEDemo07

本文通过一个编程实例介绍了如何使用Java实现多态来计算不同图形(如三角形、圆形、正方形和矩形)的周长和面积。通过定义一个Shape类作为父类,以及几个子类,展示了继承和方法重写的概念,并在测试类中展示了如何利用多态调用这些方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

  • 本文是2021/03/29整理的笔记
  • 赘述可能有点多,还请各位朋友耐心阅读
  • 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进。

练习题:(多态)写一个函数,接收一个图形作为参数,打印出该图形的周长和面积

  • (1)父类图形Shape类
  • (2)子类三角形Triangel类
  • (3)子类圆形Circle类
  • (4)子类正方形Square类
  • (5)子类矩形Rectangle类
  • (6)分别求各图形的周长和面积

题目分析

  • 本题中Shape类只需要写两个方法即可,计算周长和计算面积的方法
  • 三角形需要设置三条边。三角形比较特殊,需满足两边之和大于第三边。这个条件可以在构造方法和Set方法中设置,也可以单独写一个方法出来。本题的代码示例将2种情况一并写在了三角形类中。
  • 圆形需要设置半径,构造方法以及相应的Getter and Setter方法
  • 正方形设置边长,构造方法以及相应的Getter and Setter方法
  • 矩形设置长和宽,构造方法以及相应的Getter and Setter方法
  • 设置一个ShapeTest类,用于直接调用所有图形的计算面积和计算周长方法

代码示例

Shape类

//Shape类
public class Shape {
    //计算周长的方法
    public void calculateCircumference(){

    }
    //计算面积的方法
    public void calculateArea(){

    }
}

Triangle类

public class Triangle extends  Shape{
    //三角形的三条边长
    private double a;
    private double b;
    private double c;
    //计算周长的方法
    @Override
    public void calculateCircumference() {
        System.out.println("三角形的周长是:"+(a+b+c));
    }
    //判断周长的方法
    public void judgeCircumference() {
        if (a + b > c && a + c > b && b + c > a && a > 0 && b > 0 && c > 0) {
        //满足条件就调用计算周长的方法
            calculateCircumference();
        } else {
            System.out.println("三角形的周长返回错误。错误:不满足三边关系或者至少一条边设置了负数");
        }
    }
     //计算面积的方法
    @Override
    public void calculateArea() {
        //使用海伦公式计算面积
        double p = (a+b+c)/2;
        double area = Math.sqrt((p-a)*(p-b)*(p-c)*p);
        System.out.println("三角形的面积是:"+area);
    }
    //判断面积的方法
    public void judgeArea(){
        if (a + b > c && a + c > b && b + c > a && a > 0 && b > 0 && c > 0) {
        //满足条件就调用计算面积的方法
            calculateArea();
        } else {
            System.out.println("三角形的面积返回错误。错误:不满足三边关系或者至少一条边设置了负数");
        }
    }
    //无参构造方法
    public Triangle() {
    }
    //有参构造方法
    public Triangle(double a, double b, double c) {
        if(a+b>c && a+c>b && b+c>a && a>0 && b>0 && c>0) {
            this.a = a;
            this.b = b;
            this.c = c;
        }else{
            System.out.println("三角形的三条边设置错误。错误:不满足三边关系或者至少一条边设置了负数");
        }
    }
    //三条边a b c 的Getter and Setter
    public double getA() {
        return a;
    }
    public void setA(double a) {
        if(a+b>c && a+c>b && b+c>a) {
            this.a = a;
        }else{
            System.out.println("三角形的三条边设置错误。错误:不满足三边关系或者至少一条边设置了负数");
        }
    }
    public double getB() {
        return b;
    }
    public void setB(double b) {
        if(a+b>c && a+c>b && b+c>a) {
            this.b = b;
        }else{
            System.out.println("三角形的三条边设置错误。错误:不满足三边关系或者至少一条边设置了负数");
        }
    }
    public double getC() {
        return c;
    }
    public void setC(double c) {
        if(a+b>c && a+c>b && b+c>a) {
            this.c = c;
        }else{
            System.out.println("三角形的三条边设置错误。错误:不满足三边关系或者至少一条边设置了负数");
        }
    }
}

Circle类

public class Circle extends Shape{
    //圆的半径
    private double radius;
    //计算面积方法重写
    @Override
    public void calculateArea() {
        //使结果保留两位小数
        System.out.println("圆的面积是:"+String.format("%.2f",Math.PI * radius * radius));;
    }
    //计算周长方法重写
    @Override
    public void calculateCircumference() {
        //结果保留两位小数
        System.out.println("圆的周长是:"+String.format("%.2f",Math.PI * radius * 2));
    }

    //无参构造方法
    public Circle() {
    }
    //有参构造方法
    public Circle(double radius) {
        if(radius>0) {
            this.radius = radius;
        }else {
            System.out.println("设置的半径错误");
        }
    }
    //半径radius的Getter and Setter方法
    public double getRadius() {
        return radius;
    }
    public void setRadius(double radius) {
        if(radius >0){
            this.radius = radius;
        }else {
            System.out.println("设置的半径错误");
        }
    }
}

Square类

public class Square extends Shape {
    //正方形的边长
    private  double side;
   //计算面积方法重写
    @Override
    public void calculateArea() {
        System.out.println("正方形的面积是:"+side*side);
    }
   //计算周长方法重写
    @Override
    public void calculateCircumference() {
        System.out.println("正方形的周长是:"+side*4);
    }

    //无参构造方法
    public Square() {
    }
    //有参构造方法
    public Square(double side) {
        this.side = side;
    }
    //边长side的Getter and Setter方法
    public double getSide() {
        return side;
    }
    public void setSide(double side) {
        if(side>0){
        this.side = side;}
        else {
            System.out.println("设置的正方形边长错误");
        }
    }
}

Rectangle类

public class Rectangle extends Shape {
    //矩形的长、宽
    private  double length;
    private  double width;
    //计算面积方法重写
    @Override
    public void calculateArea() {
        System.out.println("长方形面积:"+length * width);
    }
    //计算周长方法重写
    @Override
    public void calculateCircumference() {
        System.out.println("长方形周长:"+(length+width));
    }

    //无参构造方法
    public Rectangle() {
    }
    //有参构造方法
    public Rectangle(double length, double width) {
        if(length>0 && width >0) {
            this.length = length;
            this.width = width;
        }else {
            System.out.println("设置的长和宽错误");
        }
    }
    //长length宽width的Getter and Setter方法
    public double getLength() {
        return length;
    }
    public void setLength(double length) {
        if(length>0){
             this.length = length;
        }else {
            System.out.println("设置的长错误");
        }

    }
    public double getWidth() {
        return width;
    }
    public void setWidth(double width) {
        if(width>0) {
            this.width = width;
        }else {
            System.out.println("设置的宽错误");
        }
    }
}

ShapeTest类

public class ShapeTest {
    //计算周长的方法,向上转型为Shape类
    public static void calculateCircumference(Shape shape){
        //如果图形是三角形类,则向下转型
          if(shape instanceof  Triangle){
              Triangle triangle = (Triangle) shape;
              //调用判断周长的方法
              triangle.judgeCircumference();
              return;
          }else {
              shape.calculateCircumference();
          }
    }
    //计算面积的方法,向上转型为Shape类
    public static void calculateArea(Shape shape){
        //如果图形是三角形类,则向下转型
        if(shape instanceof  Triangle){
            Triangle triangle = (Triangle) shape;
            //调用判断面积的方法
            triangle.judgeArea();
            return;
        }else {
            shape.calculateArea();
        }
    }
    //main方法
    public static void main(String[] args) {
        //Triangle类
        Shape triangle = new Triangle(3.0,4.0,5.0);
        calculateCircumference(triangle);
        calculateArea(triangle);

        //Circle类
        Shape circle = new Circle(5.0);
        calculateCircumference(circle);
        calculateArea(circle);

        //Square类
        Shape square = new Square(5.0);
        calculateCircumference(square);
        calculateArea(square);

        //Rectangle类
        Shape rectangle = new Rectangle(5.0,4.0);
        calculateCircumference(rectangle);
        calculateArea(rectangle);
    }
}

程序运行结果

在这里插入图片描述

关联与依赖

关联

  • 类间是has - a 的关系,一个类的对象作为另一个类的属性,生命周期没有必要联系。

一对一

  • 比如说人与身份证的关系,一个人只能持有一张合法的身份证,一张身份证只对应一个人。
    代码示例:
//身份证的类
public class IdCard{
//身份证的id
String id;
//身份证号码
String number;
}
//人的类
public class Person(){
String name;
String id;
int age;
//身份证
IdCard idcard;
}

一对多

  • 比如说一间教室对应多个学生,教室中有一个数组或集合存储学生
  • 代码示例:
//学生类
public class Student{
String name;
int age;
//性别
String gender;
}
//教室类
public class ClassRoom{
Student[] students;
}

聚合

  • 类间是has - a的关系 ,在语法上和关联没有区别,只能从语义上区分。生命周期没有必要联系。
  • 例如:一个学校有很多学生
  • 代码示例:
 public class Student{
 }
 public class School{
 private Student[ ]  students;
 }

组合

  • 类与类间是contains - a 关系,生命周期有必要联系。部分必须后于整体创建或同时创建,部分必须先于整体销毁或同时销毁。
  • 比如说一个游戏和一个游戏的菜单,菜单必须在游戏开启时或游戏开启后才能打开,菜单必须在游戏关闭时或游戏关闭前关闭。
  • 聚合和组合的区别:
  • 聚合的生命周期没有必要联系,组合的生命周期有必要联系。

依赖

  • 类与类间是use - a的关系,将一个类的对象作为另一个类中的方法参数使用。生命周期没有必要联系
  • 代码示例:
//鼠标类
public class Mouse(){
}
//人的类
public class Person(){
public void useMouse(Mouse mouse){
System.out.println("人正在使用"+mouse);
}
}

几种关系的强弱比较

  • 依赖<关联<聚合<组合

JDK常用包

  • java.lang Java语言核心类库
  • java.util包 工具类
  • java.net 网络编程
  • java.sql 数据库
  • java.text 格式化
  • java.io 输入输出

Object类的主要方法

equals方法

  • public boolean equals(Object obj)
  • 对象比较:比较两个对象的虚地址是否相同
  • 如果想要满足其他需要可以重写此方法

hashCode

  • public int hashCode()
  • 取得Hash码

toString

  • public String toString()
  • 对象打印时调用
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香鱼嫩虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值