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

这篇具有很好参考价值的文章主要介绍了JAVA:定义一个抽象类Shape,计算各种子类图形的面积(简易详细版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

(1)定义矩形

步骤:
1.继承形状类Shape

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

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

2.创建空参构造和全参构造

完整代码:

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));
    }
}

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

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

(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://www.toymoban.com/news/detail-477370.html

到了这里,关于JAVA:定义一个抽象类Shape,计算各种子类图形的面积(简易详细版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android shape定义背景带阴影

    原理其实就是一层一层往上盖,padding就是里面的小抽屉比外面的大抽屉从left,right,top,bottom上分别小多少像素 多盖几层,也就出来阴影了,越往上面这层颜色也就越深,也就是颜色从0a变到2d,最后一个shape也就是最上面这层的颜色,这里用gradient做的从上到下的渐变色

    2024年02月11日
    浏览(40)
  • 计算机视觉与图形学-神经渲染专题-第一个基于NeRF的自动驾驶仿真平台

    如今,自动驾驶汽车可以在普通情况下平稳行驶,人们普遍认识到,真实的 传感器模拟将在通过模拟解决剩余的极端情况方面发挥关键作用 。为此,我们提出了一种基于神经辐射场(NeRF)的自动驾驶模拟器。与现有作品相比,我们的作品具有三个显着特点:(1) 实例感知

    2024年02月12日
    浏览(52)
  • 设计一个学生类和它的一个子类——本科生类

    设计一个学生类( Student )和它的一个子类——本科生类( Undergraduate )。要求如下: (1)Student类有姓名( name )和年龄( age )属性,两者的访问权限为 protected ;一个包含两个参数的构造方法,用于给姓名和年龄属性赋值;一个 show( ) 方法用于输出Student的属性信息,输

    2023年04月09日
    浏览(49)
  • 【PTA】7-3 定义接口(Biology、Animal)、类(Person)、子类(Pupil)

    7-3 定义接口(Biology、Animal)、类(Person)、子类(Pupil)(分数 30) (1)定义 Biology (生物)、 Animal (动物)2个接口,其中Biology声明了抽象方法 breathe( ) ,Animal声明了抽象方法 eat( ) 和 sleep( ) 。 (2)定义一个类 Person (人)实现上述2个接口,实现了所有的抽象方法,同

    2024年02月08日
    浏览(78)
  • 计算机图形学,OpenGL编写的一个可实现旋转缩放移动的房间,内有数十种交互

    #include stdlib.h #includestdio.h #includewindows.h #include GL/glut.h #include math.h #include gl/GLU.h //颜色宏定义 #define white 1.0f, 1.0f, 1.0f #define black 0.0f, 0.0f, 0.0f #define red 1.0f, 0.0f, 0.0f #define blue 0.0f, 0.0f, 1.0f #define skyBlue 135.0/255.0, 206.0/255.0, 1.0f #define plum 1.0f, 187.0/255.0, 1.0f //浅紫色 #define pink 1.0f, 1

    2024年04月17日
    浏览(65)
  • Android自定义ProgressBar样式(Shape实现转动的圆环)

    最终效果 第一步:在drawable文件夹下新建一个xml文件叫progressbar_shape.xml,代码如下: progressbar_shape.xml 第二步:在ProgressBar中使用indeterminateDrawable属性引用上面的xml文件 你布局里的ProgressBar

    2024年02月01日
    浏览(41)
  • 【Java基础教程】(十五)面向对象篇 · 第九讲:抽象类和接口——定义、限制与应用的细节,初窥模板设计模式、工厂设计模式与代理设计模式~

    掌握 抽象类和接口的定义、使用、区别、常见设计模式; 抽象类是代码开发中的重要组成部分,利用抽象类可以明确地定义子类需要覆写的方法,这样相当于在语法程度上对子类进行了严格的定义限制,代码的开发也就更加标准。下面具体介绍抽象类的概念。 普通类可以直

    2024年02月16日
    浏览(48)
  • 计算机图形学环境配置java3D

    java3Dwindows64位下载 这个是默认到下图路径中:(记住这个路径,待会要导入jar包) 选择这个: 所以我把jdk改成了这个1.8版本就可以了: 将java3D目录下面的bin目录中的dll文件拷贝到idea里配置的jdk路径的bin目录下: idea里配置的jdk路径的bin目录: 把这个文件拷贝过去: 打开

    2024年02月09日
    浏览(38)
  • C++笔记之基类指针动态地指向某一个子类情况列举

    code review!

    2024年02月12日
    浏览(49)
  • Java 强制类型转换原理(父类转子类、子类转父类)

    在Java中,对象的强制转换(也称为类型转换)是将一个对象的引用转换为另一个类的引用,前提是这两个类之间存在继承或实现关系。强制转换可能会导致运行时异常,因为在转换的过程中,如果对象的实际类型与转换的目标类型不兼容,就会抛出ClassCastException异常。 分析

    2024年02月07日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包