4.0、Java继承与多态 - 抽象类与抽象方法

news2025/1/12 23:09:10

4.0、Java继承与多态 - 抽象类与抽象方法

先给大家举个例子 ->

创建一个父类 - 图形类;图形类中有一个计算面积的方法 calculateArea();

创建三个子类 - 正方形、三角形、圆形 类;

        由于我们图形类父类中未明确指明是什么图形,所以他的计算面积的方法也无法实现,因为你不知道到底是什么图形嘛;那么这种方法就被我们称作为 抽象方法

        而下图中的正方形、三角形、圆形三个子类,都是继承自父类图形类;父类中的抽象方法在被子类继承之后会被重写(实现);

 

如何创建一个抽象类以及抽象方法呢? 如下代码所示->

/**
 * 抽象类:抽象方法所在的类,必须是抽象类;也就是说拥有抽象方法的类一定是抽象类;在 class 前加上 abstract 即可;
 * 抽象方法:就是加上 abstract 关键字,然后去掉大括号,直接分号结束即可;
 */
    //创建一个抽象类 Shapes
public abstract class Shapes {
    //创建一个抽象方法,代表计算图形的面积;
    //但是具体如何计算(方法体)不确定;
    public abstract void calculateArea();
    //在一个抽象类中定义普通方法也是可以的 ->
    public void normalMethod() {
        System.out.println("这是一个普通方法~");
    }
}

        - 抽象类:抽象方法所在的类,必须是抽象类;也就是说拥有抽象方法的类一定是抽象类 ]在 class 前加上 abstract 即可;

        - 抽象方法:就是加上 abstract 关键字,然后去掉大括号,直接分号结束即可;

        - 当然在抽象类中也不一定只有抽象抽象方法,也是可以定义普通方法的;

如何使用抽象类和抽象方法呢?

        注意:不能直接创建 new 抽象对象;[ 其实很好理解 -> 创建对象的过程也称之为实例化,既然已经实例化了,肯定是应该得到一个具体的对象,而不是一个抽象的对象 ];

        第一步:创建一个子类来继承抽象父类;

        第二步:子类必须覆盖重写( 或者叫 - 实现 )父类中所有的抽象方法 [ 实际上就是将父类中的抽象方法去掉 abstract 然后加上方法体 ];

        注意:如果希望子类为普通类,那么子类就必须要实现父类中所有的抽象方法;因为如果没有实现父类中所有的抽象方法,子类中继承了这些没有实现的抽象方法,那么会导致子类也会变成抽象类; ]

        第三步:最后创建子类对象进行使用;

上代码理解一下 ->
创建子类正方形类 Square.java 文件,并继承上面已创建好的父类图形 Shapes 类如下所示 ->

public class Square extends Shapes {
    @Override
    public void calculateArea() {
        System.out.println("长乘宽得到正方形的面积");
    }
}

注意事项

        关于抽象类的使用,一下为语法上要注意的细节,虽然条目较多,但若理解了抽象的本质,无需死记硬背;

        1.抽象类不能创建对象,如果创建,编译无法通过会报错;只能创建其非抽象子类的对象;

理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义;

        2.抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的;

理解:子类的构造方法中,有默认的 super() ,会默认访问父类的构造方法;

        3.抽象类中,不一定包含抽象方法,但是有抽象方法的必定只有抽象类;

理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的结构设计;

        4.抽象类的子类,必须重写父类中所有的抽象方法,否则编译无法通过会报错;除非子类也是抽象类;

理解:假设不重写所有的抽象方法,则类中可能包含抽象方法;那么创建对象后,调用抽象的方法,没有意义;

一定有人会疑惑为什么会有子类不重写所有父类抽象方法的情况存在;

下面给大家举个父类是抽象类,子类也是抽象类,然后子类的子类是普通类的例子 ->

- 创建 Animal.java 顶级父类,文件如下所示 ->

public abstract class Animal {

    public Animal() {
        System.out.println("Animal构造方法执行......");
    }
    //动物的饮食
    public abstract void eat();
    //动物的颜色
    public abstract void color();
}

- 创建 Cat.java 且让他继承自上面 Animal 父类,文件如下所示->

public abstract class Cat extends Animal {

    public Cat() {
        System.out.println("Cat构造方法执行......");
    }

    @Override
    public void eat() {
        System.out.println("猫吃鱼......");
    }
}

- 创建 MuppetCat.java 布偶猫类,且让他继承自上面的 Cat 父类,文件如下所示->

//布偶猫
public class MuppetCat extends Cat {

    public MuppetCat() {
        System.out.println("MuppetCat构造方法执行......");
    }

    @Override
    public void color() {
        System.out.println("布偶猫 - 白色");
    }
}

- 创建 OrangeCat.java 橘猫类,且让他也继承自上面的 Cat 父类,文件如下所示 ->

//橘猫
public class OrangeCat extends Cat {

    public OrangeCat() {
        System.out.println("OrangeCat构造方法执行......");
    }

    @Override
    public void color() {
        System.out.println("橘猫 - 橘色");
    }
}

- 创建测试类 CatMain.java 文件如下所示 ->

public class CatMain {

    public static void main(String[] args) {
//        Animal animal = new Animal();//错误,无法创建抽象类对象
//        Cat cat = new Cat();//错误,无法创建抽象类对象
        MuppetCat mc = new MuppetCat();
        mc.eat();
        mc.color();

        OrangeCat oc = new OrangeCat();
        oc.eat();
        oc.color();
    }
}

- CatMain.java文件,执行结果如下所示 ->

解释一下:

        由于 Animal 是顶级父类,Cat 是 Animal 子类,而 MuppetCat 是 Cat 的子类;所以当我们创建 MuppetCat 对象的时候,默认会执行 super();方法调用父类的构造函数;所以可以看到上图中构造函数的执行顺序是 Animal -> Cat -> MuppetCat;[ 由于抽象类不能创建对象,所以这也是一种调用抽象类构造函数的方法; ]

        可以发现我们在 Cat 类中仅仅实现了抽象类父类 Animal 中的 eat() 方法,并没有实现 color() 方法,所以Cat 仍然是一个抽象类;[ 其实从逻辑上也很好理解,因为 Cat 仅仅是一个猫的类,并没有具体指明是什么品种的猫,所以只能确定猫的食物是鱼;而没法知道它是什么颜色,所以没法实现颜色的方法; ]

        最后在 MuppetCat 和 OrangeCat 两个类中,由于他们都继承自 Cat 类,而Cat又继承自 Animal 类,所以他们如果想要成为普通类就必须要实现 eat() 和 color() 两个抽象方法;而在 Cat 类中已经将 eat() 方法实现了,所以在这两个类里只需要实现 color() 方法即可成为普通类;

        然后就可以通过创建 MuppetCat 或者 OrangeCat 的对象去调用 eat() 和 color() 两个方法啦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/436067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内网域环境搭建学习

建立的关系就是这样,接下来就开始讲解遇到的困难 虚拟机中我们可以克隆来实现域的搭建 可能会出现这样的问题,原因是你的虚拟机没有关闭,所以才会导致这样的原因,解决方法 将虚拟机打开后,电源 -> 关闭客户机&…

MySQL学习笔记第二天

第03章 基本的SELECT语句 1.SQL概述 1.1 SQL背景知识 1946年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖。在这几十年里,无数的技术、产业在这片江湖里沉浮,有的方兴未艾,有的…

reactxp搭建,start:windows运行不起来

1、官网 reactxp 2、VSCode和Visual Studio2019 安装VSCode Visual Studio 下载地址 先不用勾选工作负荷,直接安装 3、安装nvm 访问下载地址下载安装nvm: 百度云分享 官网直装链接 nvm的github发行界面下载nvm-setup.exe GitCode镜像下载nvm-setup…

ACL配置学习(附练习题)------ensp

从此文了解ACL配置,欢迎学习、指导。 目录 基本ACL配置举例 高级ACL配置举例 ACL配置练习题 定义 访问控制列表ACL(Access Control List)本质上是一种报文过滤器。 范围: OSI七层模型中的网络层、传输层的信息。 滤芯:五…

2023年4月实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先,来看下效果图 在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

大型医院体检管理系统源码,PEIS体检系统源码 丰富的诊断模板,自动产生小结、综述和建议

PEIS体检管理系统源码 体检条码化管理,体检数据比对,丰富的诊断模板,自动产生小结、综述和建议。 文末获取联系 PEIS体检管理系统对医院体检中心进行系统化和规范化的管理,大大提高体检中心的综合管理水平、工作效率。系统从业务…

设计模式-结构型模式之享元模式

5. 享元模式 5.1. 模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。 享元模式正是为解决这一类问题而诞生的。享元模…

GoF代理模式

在java中代理模式的作用: 1.一个对象需要受到保护的时候,可以考虑使用代理对象取完成某个行为. 2.需要给某个对象的功能进行功能增强的时候,可以考虑找一个代理进行增强 3.A对象无法和B对象无法直接沟通,也可以使用代理模式解决 代理模式有三…

WPF mvvm框架Stylet使用教程-窗体交互用法

窗体操作 打开窗体 在stylet框架中,要打开一个窗口或者对话框,只需要直接使用窗口管理器 在要使用的ViewModel中注入IWindowManager,然后使用他的方法操作窗口。 ShowDialog(object viewModel)模态显示ShowWindow(object viewModel) 非模…

修改OPNET帮助文档的默认打开浏览器 给Edge浏览器配置IE Tab插件

我在使用 OPENT Modeler 软件时经常会用到帮助文档,但是其默认打开的是 IE 浏览器,想要其在 Edge 浏览器中打开,但是会出现网页无法打开的情况,这时需要给 Edge 浏览器安装一个 IE Tab 插件。 IE Tab 插件是专门针对浏览器而开发的…

vue3的介绍和两种创建方式(cli和vite)

目录 一、vue3的介绍 (一)vue3的简介 (二)vue3对比vue2带来的性能提升 二、vue3的两种创建方式 方式一:使用vue-cli创建(推荐--全面) 操作步骤 方式二:使用vite创建 操作步…

Spring是什么?关于Spring家族

初识Spring 什么是Spring? Spring是一个开源的Java企业级应用程序开发框架,由Rod Johnson于2003年创建,并在接下来的几年里得到了广泛的发展和应用。它提供了一系列面向对象的编程和配置模型,支持开发各种类型的应用程序&#x…

黑客网站攻击的主要手段

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 黑客与白帽子 有的童鞋觉得黑客和白帽子是同一回事儿,其实不然;而且,他们的工作方式与目标也有很大的差异。 黑客是指一群专门使用计算机…

9.2 变量的指针和指向变量的指针变量

9.2 变量的指针和指向变量的指针变量 一.指针变量的定义二.指针变量的引用三.整理至https://appd872nnyh9503.pc.xiaoe-tech.com/index的笔记 一.指针变量的定义 变量的指针 就是变量的地址。 我们可以定义一个指向 变量 的指针变量。 这种指针变量,我们在定义的时…

信创办公–基于WPS的EXCEL最佳实践系列 (筛选重要数据)

信创办公–基于WPS的EXCEL最佳实践系列 (筛选重要数据) 目录 应用背景操作步骤1、筛选2、高级筛选 应用背景 在WPS里,筛选有两种,一种是筛选,另外一种则是高级筛选。 操作步骤 1、筛选 可以根据学号、准考证号、考…

MyBatisPlus基础入门学习

系列文章目录 MyBatisPlus基础入门学习 文章目录 系列文章目录前言一、MyBatisPlus简介1.入门案例2.MyBatisPlus概述 二、标准数据层开发1.标准数据层CRUD功能2.分页功能 三、DQL控制1.条件查询方式2.查询投影3.查询条件设定4.字段映射与表名映射 四、DML控制1.Insert2.Delete…

原创文章生成器在线版-ai写作生成器

随着人工智能技术的迅猛发展,越来越多的人开始意识到,利用AI可以实现许多以前不可能想象的事情。其中,一种最能体现人工智能技术优势的应用就是“ai原创文章生成器”。它可以为营销从业者提供一种全新的营销推广方式。 那么,什么是…

AIGC技术赋能下 CRM将迎来怎样的变革?

今年以来,随着ChatGPT的爆火,人工智能(AI)迎来新一轮的热潮,开始更多地走入人们的视野。如果说2016年“阿尔法狗”(Alpha Go)大战围棋世界冠军还只是人工智能的“昙花一现”,那么Cha…

在 FPGA 上如何实现双线性插值的计算?

作者 | 殷庆瑜 责编 | 胡巍巍 目录 一、概述 二、What?什么是双线性插值? 二、Why?为什么需要双线性插值? 三、How?怎么实现双线性插值? 关键点1 像素点选择 关键点2 权重计算 升级1 通过查表减少…

深入分析Linux网络丢包

1、背景: 从图中你可以看出,可能发生丢包的位置,实际上贯穿了整个网络协议栈。换句话说,全程都有丢包的可能。 在两台 VM 连接之间,可能会发生传输失败的错误,比如网络拥塞、线路错误等;在网卡…