我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JAVA:定义一个抽象类Shape,计算各种子类图形的面积(简易详细版)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JAVA:定义一个抽象类Shape,计算各种子类图形的面积(简易详细版)

目录

(一)定义一个抽象的形状类Shape

为什么要定义为抽象类?
因为要计算的形状面积各不相同,方法体是不确定的,所以方法定义为抽象方法,抽象方法所在的类必须为抽象类(而抽象类不一定有抽象方法)。

返回值类型也可以定义为其他的数据类型

public abstract class Shape {    public abstract double  CalculateArea();}

(二)定义Shape的子类,即各种图形

(1)定义矩形

步骤:
1.继承形状类Shape

此时会显示报错,因为需要重写父类的抽象方法
CalculateArea()
@Override下面的代码代表重写

定义成员变量—>矩形的参数,长和宽

创建空参构造和全参构造

完整代码:

public class Rectangle extends Shape {    //参数    int width;    int length;//空参构造    public Rectangle() {    }//全参构造    public Rectangle(int width, int length) {        this.width = width;        this.length = length;    }//重写方法    @Override    public double CalculateArea() {        System.out.println("该矩形的面积是:"+width*length);        return width*length;    }}

(2)定义平行四边形

步骤和矩形类的步骤大同小异,只需要将对应的变量修改即可

完整代码:

public class Parallelogram extends Shape {    //参数    int height;    int base;//空参构造    public Parallelogram() {    }//全参构造    public Parallelogram(int height, int base) {        this.height = height;        this.base = base;    }//重写方法    @Override    public double CalculateArea() {        System.out.println("该平行四边形的面积是:"+height*base);        return height*base;    }}

(3)定义圆形

注意参数pi不需要写在有参构造的参数里,只需要有半径就可以了。

完整代码:

public class Circle extends Shape {    //参数    int r;    double pi=3.1415926;//空参构造    public Circle() {    }//有参构造    public Circle(int r) {        this.r = r;    }//重写方法    @Override    public double CalculateArea() {        System.out.println("该圆形的面积是:"+pi*r*r);        return pi*r*r;    }}

(4)定义三角形

完整代码:

public class Triangle extends Shape {    //参数    int base;    int height;//空参构造    public Triangle() {    }//全参构造    public Triangle(int base, int height) {        this.base = base;        this.height = height;    }//重写方法    @Override    public double CalculateArea() {        System.out.println("该三角形的面积是:"+base*height*0.5);        return base*height*0.5;    }}

(三)定义一个计算类Operation

定义一个计算类,类里面定义一个计算方法

注意:参数写为所有图形的父类Shape,这样不论传什么类型的图形变量都能够被接收,构成多态。

方法体里调用Shape类的计算面积方法

完整代码:

public class Operation {    public void operate(Shape shape ){        shape.CalculateArea();    }}

(四)定义一个测试类测试

注意此处调用方法的写法:
更为详细的步骤:以矩形为例
首先new一个Rectangle类型的对象,赋值给左边Shape类型(父类)的变量s
然后调用operate方法,参数写s

       //调用方法        //矩形        Shape s=new Rectangle(5,6);        o.operate(s);

简易的写法:省去赋值的过程,new出来的对象直接作为参数。

 //调用方法        //矩形        o.operate(new Rectangle(5,6));

完整代码:

public class test {    public static void main(String[] args) {        //创建一个计算器        Operation o=new Operation();        //调用方法        //矩形        o.operate(new Rectangle(5,6));        //圆形        o.operate(new Circle(4));        //平行四边形        o.operate(new Parallelogram(6,9));        //三角形        o.operate(new Triangle(12,7));    }}

运行结果:
在这里插入图片描述

(五)涉及到的一些基础知识

(1)关于抽象类和抽象方法

1.抽象类的作用是什么?

①抽取共性时而无法确定具体的方法体,就把方法定义为抽象的,所以抽象类不能实例化(没有方法体)。
②父类会强制子类重写,并且必须按照父类的格式,比如父类无参子类必须无参,否则报错。
③抽象方法所在的类,必须定义为抽象类。但是抽象类中不一定有抽象方法。
④抽象类可以有构造方法,在实例化子类的对象的时候,无论父类是否为抽象类,子类都会默认在自己的构造方法的里调用父类的构造方法,初始化一个子类会优先初始化它的父类。

2.抽象类的子类

子类要么重写抽象类中的所有抽象方法,要么自己本身就是抽象类。

3.抽象类和抽象方法定义的格式

①定义抽象方法:
修饰符 abstract 返回值类型 方法名 (参数列表);
特别注意:没有方法体,以分号结束

声明抽象方法的限制:不能是static/private/final修饰的方法

②定义抽象类:
修饰符 abstract class 类名{}

(2)关于多态

1.什么是多态?

同类型的对象,表现出的不同形态。

比如同为人类(Person类),而张三是学生类(Student类),李四是老师类(Teacher类),那么人类就是学生类和老师类共同的父类。

2.多态的表现形式

父类类型 对象名称= 子类对象;

创建对象:
父类类型 对象名称=new 子类对象();

例如:Person p=new Student();

3.多态的前提

①有继承关系
②有父类引用指向子类对象
③有方法的重写

4.多态调用成员的特点

①变量调用,编译看左边,运行看右边。

javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,则编译成功,如果没有则直接编译失败。
例如:Person p=new Student();
sout(p.name)
此时输出的就是父类的name变量的值,而不是Student类

②方法调用:编译看左边,运行看右边。

javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,则编译成功。
原因:子类对父类的方法进行了重写,那么在虚方法表中会把父类的方法进行覆盖。

5.多态的优劣

①多态的优势

在多态形势下,右边对象可以实现解耦合,便于扩展和维护。
在方法中,使用父类类型的变量作为参数,则可以接受所有子类的对象。

②多态的弊端

不能使用子类特有的功能

③解决多态不能实现子类特有功能的方法

将变量的类型强制转换为子类类型
例如:
Person p=new Student();
Student s=(Student)p;

转换的时候可以用instanceof关键词进行判断,比如用if语句判断是学生类还是老师类,然后实现具体的功能。

注意不能随意转换,比如Person类型的Student对象只能转换为Student类型的Studentd对象,而不能转换为Teacher类型的。

来源地址:https://blog.csdn.net/YesAnna_/article/details/130308722

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JAVA:定义一个抽象类Shape,计算各种子类图形的面积(简易详细版)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录