抽象类-Java

抽象类

  • 一、父类方法的不确定性
  • 二、抽象类介绍
  • 三、抽象类细节
  • 四、练习题

一、父类方法的不确定性

引入:对于一个动物,不知道它吃什么,比如猫吃鱼,兔子吃萝卜。动物类中的 eat 方法往往由它的子类去具体实现。

class Animal {public void eat() {System.out.println("我不是具体的动物,目前不知道吃什么。");}
}

父类方法的不确定性:
当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类。

=> 所谓抽象方法就是没有实现的方法
=> 所谓没有实现就是指,没有方法体
=> 当一个类中存在抽象方法时,需要将该类声明为abstract类
=> 一般来说,抽象类会被继承,有其子类来实现抽象方法
在这里插入图片描述

二、抽象类介绍

  1. 用abstract关键字来修饰一个类时,这个类就叫抽象类。
访问修饰符 abstract 类名{
}
  1. 用abstract关键字来修饰一个方法时,这个方法就是抽象方法。
    抽象方法没有方法体
访问修饰符 abstract 返回类型 方法名(参数列表);  
  1. 抽象类的价值更多作用是在于设计,是设计者设计好后,让子类继承并实现抽象类。
  2. 抽象类,是考官比较爱问的知识点,在框架和设计模式使用较多。

三、抽象类细节

AbstractDetail01.java

  1. 抽象类不能被实例化。[举例a. 见后文]
  2. 抽象类不一定要包含abstract方法。也就是说,抽象类可以没有abstract方法。[举例b. 见后文]
  3. 一旦类包含了abstract方法,则这个类必须声明为abstract。
  4. abstract 只能修饰类和方法,不能修饰属性和其它的。
  5. 抽象类可以有任意成员【因为抽象类还是类】,比如:非抽象方法、构造器、静态属性等等。[举例c.]
  6. 抽象方法不能有主体,即不能实现。
  7. 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类。[举例d.]
  8. 抽象方法不能使用 private、final 和 static 来修饰,因为这些关键字都是和重写相违背的。
    说明:
    ①父类的属性&成员为private,子类无法访问。
    ②final本意就是不希望子类来继承。
    ③static修饰的方法是静态方法,可以直接被类调用。而abstract修饰的方法是抽象方法,即无方法体的方法,不能被直接调用,需要在子类或实现类中去编写完整的方法处理逻辑后才能使用。
  • 举例

a.
在这里插入图片描述
b.

abstract class A {//抽象类不一定要包含abstract方法。// 也就是说,抽象类可以没有abstract方法// 还可以有实现的方法。String name;public void hi() {System.out.println("hi");}
}

c.
抽象类的本质还是类,所以可以有类的各种成员

abstract class C {public int num;public static String name = "haha";public void hi() {System.out.println("hi~");}public static void hello() {System.out.println("hello!");}public abstract void eat();
}

d.
这里相等于Mama子类实现了父类GrandMa的抽象方法,所谓实现方法,就是有方法体(方法体内具体实现不关心)。

abstract class GrandMa {public abstract void hi();public abstract void hello();
}
class Mama extends GrandMa{public void hi() {System.out.println("hi");}public void hello() {System.out.println("hello");}
}

四、练习题

  1. 题1,思考: abstract final class A()能编译通过吗,why?
  2. 题2,思考: abstract public static void test2();能编译通过吗,why?
  3. 题3,思考: abstract private void test3(); 能编译通过吗, why?

我的回答:
三个都不能
正确。

  1. 编写一个Employee类,声明为抽象类,包含如下三个属性:name,id,salary。提供必要的构造器和抽象方法:work()。对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。请使用继承的思想,设计CommonEmployee类和Manager类,要求类中提供必要的方法进行属性访问,实现work(),提示"经理/普通员工名字工作中.……"
public class AbstractExercise01 {public static void main(String[] args) {Manager sb = new Manager("sb", 38, 6000.5,100.0);CommonEmployee poor = new CommonEmployee("poor", 66, 5000.1);sb.work();poor.work();}
}abstract class Employee {private String name;private int id;private double salary;public Employee(String name, int id, double salary) {this.name = name;this.id = id;this.salary = salary;}public String getName() {return name;}public void setName(String name) {this.name = name;}abstract public void work();
}class Manager extends Employee {public double bonus;public Manager(String name, int id, double salary,double bonus) {super(name,id,salary);this.bonus = bonus;}public void work() {System.out.println("Manager "+ this.getName() +" is sleeping···");}
}class CommonEmployee extends Employee {public CommonEmployee(String name, int id, double salary) {super(name,id,salary);}public void work() {System.out.println("CommonEmployee "+this.getName()+" is working···");}
}

在这里插入图片描述
和韩老师视频中的代码核对之后,改进的点:
CommonEmployee和Manager的work()方法上面写上 Override

 @Override

本笔记是对韩顺平老师的Java课程做出的梳理。方便本人和观看者进行复习。
课程请见: https://www.bilibili.com/video/BV1fh411y7R8/?spm_id_from=333.999.0.0&vd_source=ceab44fb5c1365a19cb488ab650bab03

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

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

相关文章

qgis添加arcgis的FeatureServer

左侧浏览器-ArcGIS要素服务器-新建连接 http://sampleserver6.arcgisonline.com/arcgis/rest/services/ 展开-双击即可

sql中group by和having的使用

group by:按照某个字段或者某些字段进行分组。 having:对分组之后的数据进行再次过滤,having必须和group by一起用,且在group by后面。 比如person表如下(以下查询均基于此表): 1.group by 用法…

为何要隐藏IP地址?网络上哪些行为需要隐藏IP和更换IP?

网络已经成为现代人生活的重要组成部分,人们在网络上交流、学习、娱乐、购物等。但是,在享受网络带来的便利时,我们也需要时刻保护自己的隐私和安全。其中,IP地址作为网络通信中的重要标识,如何隐藏以及在哪些情况下需…

C语言题目强化-DAY12

题型指引 一、选择题二、编程题 ★★写在前面★★ 本题库源自互联网,仅作为个人学习使用,记录C语言题目练习的过程,如果对你也有帮助,那就点个赞吧。 一、选择题 1、请阅读以下程序,其运行结果是( &#x…

CMake语法解读 | Qt6需要用到

CMake 入门CMakeLists.txtmain.cpp编译示例cmake常用参数入门 Hello CMake CMake 是一个用于配置跨平台源代码项目应该如何配置的工具建立在给定的平台上。 ├── CMakeLists.txt # 希望运行的 CMake命令 ├── main.cpp # 带有main 的源文件 ├── include # 头文件目录 …

GLM: 自回归空白填充的多任务预训练语言模型

当前,ChatGLM-6B 在自然语言处理领域日益流行。其卓越的技术特点和强大的语言建模能力使其成为对话语言模型中的佼佼者。让我们深入了解 ChatGLM-6B 的技术特点,探索它在对话模型中的创新之处。 GLM: 自回归空白填充的多任务预训练语言模型 ChatGLM-6B 技…

C++二分查找视频教程:两数之和

作者推荐 利用广度优先或模拟解决米诺骨牌 本文涉及的基础知识点 二分查找算法合集 题目 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 n…

Webhook端口中的自签名身份验证

概述 有时,可能需要通过 Webhook 端口从交易伙伴处接收数据,但该交易伙伴可能需要更多的安全性,而不仅仅是用于验证入站 Webhook 请求的基本身份验证用户名/密码 – 或者您可能只想在入站 Webhook 消息上添加额外的安全层。 使用 Webhook 端…

使用STM32和蓝牙模块进行无线数据传输的实践

无线数据传输在现代通信领域中具有重要的地位,而蓝牙技术是一种常用的无线数据传输技术。本文介绍了如何使用STM32微控制器和蓝牙模块实现无线数据传输的方案,包括硬件设计、蓝牙模块配置、数据发送和接收等步骤,并给出相应的代码示例。 一、…

Codebeamer—软件全生命周期管理轻量级平台

产品概述 Codebeamer涵盖了软件研发的生命周期,在一个整合的平台内支持需求管理、测试管理、软件开发过程管理以及项目管理等,同时具有IToperations&DevOps相关的内容,并支持变体管理的功能。对于使用集成的应用程序生命周期管理&#xf…

13.端点、簇、属性

源码地址:13.端点、簇、属性 端点(endPoint) 一个端点就是一个应用 一个字节编号,数据收和发送的基本单元,在模块通信的时候,发送模块必须指定收发双方模块的网络地址和端点。端点要使用必须要和模块里的…

MFC添加窗体菜单栏和消息响应

在资源视图右键,添加资源,选择Menu,新建 添加的菜单在资源菜单的Menu目录下 双击直接编辑输入菜单 之后在要添加菜单的窗体的属性Menu里面填写菜单的ID就可以了 如何给菜单添加点击响应? OnCommand是MFC中的一个消息处理函数,用于处理在窗口或控件被激活时发出的WM_CO…

java.sql.SQLException: No suitable driver 问题解决

问题出现 自己在写一个连接C3P0数据库连接池库的测试类,运行该类后出现了下图这个问题 这是我写的测试类 package demo;import com.mchange.v2.c3p0.ComboPooledDataSource;import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLExcept…

竞赛选题 题目:基于大数据的用户画像分析系统 数据分析 开题

文章目录 1 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…

Unity Meta Quest 一体机开发(八):实现 Hand Grab 扔物体功能

文章目录 📕教程说明📕设置刚体和碰撞体📕给物体添加 Physics Grabbable 脚本📕给手部添加 Hand Velocity Calculator 物体 此教程相关的详细教案,文档,思维导图和工程文件会放入 Seed XR 社区。这是一个高…

Open Feign 源码解析(一) --- FactoryBean的妙用

什么是Open Feign? OpenFeign 是 Spring Cloud 全家桶的组件之一, 其核心的作用是为 Rest API 提供高效简洁的 RPC 调用方式 搭建测试项目 服务接口和实体 项目名称 cloud-feign-api 实体类 public class Order implements Serializable {private Long id;p…

Vue3的项目创建到启动

Vue3的项目创建 检查node版本创建 npm init vuelatest 安装依赖 项目启动 启动成功

java学习part15单例模式

107-面向对象(高级)-单例设计模式与main()的理解_哔哩哔哩_bilibili 1.单例 就是说在某些开发场景中,某个类只要有一个对象就足够使用了,不需要重复创建。 (理解:比如说是数据库对象,使用时创建一个可以处理所有的数…

苍穹外卖项目笔记(5)——Redis

1 入门 1.1 Redis 简介 Redis 是一个基于内存的 key-value 结构数据库,官网链接(中文):https://www.redis.net.cn 特点: 基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻&am…

C语言进阶-程序环境和预处理

目录 ​编辑 翻译环境 编译过程 预定义符号 #define #define 定义标识符 #define 定义宏 注意 例1 例2 提醒 #和## ##的作用 ​编辑 #的作用 ​编辑 带副作用的宏参数 预处理结果 输出结果 宏和函数对比 宏的缺点 命名约定 #undef 文件包含 本地文件包含 库文件包含…