【JAVA学习笔记】40 - 抽象类、模版设计模式(抽象类的使用)

news2024/12/23 19:53:12

项目代码

https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/abstract_

一、抽象类的引入

        很多时候在创建类的时候有一个父类,比如animal类,他的子类会有各种方法,为了复用需要进行方法的重写,比如子类Cat会eat(),所以不得已只能在animal类内也需要写eat()方法,但没有意义。

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

abstract class Animal{
    // public void eat(){System.out.println("eat但不知道谁在吃");}//所以需要抽象方法
        //这里实现了eat(),但其实没有什么意义
        //即 父类方法不确定性的问题
        //===>考虑该方法设计为抽象(abstract)方法
        //==>所谓抽象方法就是没有实现的方法
        //===>所谓没有实现就是指,没有方法体
    abstract public void eat();
        //注意 当一个类中存在抽家方法时,需要将该类声明为abstract类

        //所以一般是子类来实现这个抽象方法的重写
}
class Cat extends Animal{
    public void eat(){
        System.out.println("小猫在吃....");
    }
}

二、抽象类的基本介绍

1)用abstract关键字来修饰个类时,这个类就叫抽象类访问修饰符abstract类名{

2)用abstract关键字来修饰一个方法时,这个方法就是抽象方法访问修饰符abstract返回类型方法名(参数列表)//没有方法体

3)抽象类的价值更多作用是在于设计,是设计者设计好后,让子类继承并实现抽象类()

4)抽象类,是考官比较爱问的知识点在框架和设计模式使用较多

三、抽象类的注意事项和细节讨论

1)抽象类不能被实例化

报错'A' is abstract; cannot be instantiated

2)抽象类不定要包含abstract方法。 也就是说抽象类可以没有abstract方法

        同上 上图的抽象类A类并没有抽象方法

3)一旦类包含了abstract方法,则这个类必须声明为abstract

4) abstract只能修饰类和方法,不能修饰属性和其它的。

5)抽象类可以有任意成员(抽象类本质还是类),比如:非抽象方法、构造器、静态属性等等

注意不能实例对象。

public class AbstractDetail02 {
    public static void main(String[] args) {
        D.nihao();
    }
}
abstract class D{
    public int n1 = 10;
    public static String name = "yinhai";
    public D(){

    }
    {

    }
    static {

    }
    public abstract void hello();
    public void ok(){

    }
    public static void nihao (){

    }
}

6)抽象方法不能有主体,即不能实现如图所示abstract void aaa(){};

7)如果个类继承 了抽象类, 则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类。

abstract class E{
    public abstract void hi();
}
abstract class F extends E{
    
}
class G extends E{
    @Override
    public void hi() {//这里G类子类实现了父类E的抽象方法,就是有方法体
        
    }
}

8)抽象方法不能使用private,final和static来修饰,因为这些关键字都是和重写相违背的。

        

 四、抽象类的课堂练习

1)题1.思考: abstract final class A{}能编译通过吗,why?

        // 不能 因为抽象的本意是继承重写

        //final修饰就已经是最终类了

2)题2,思考: abstract public static void test2(); 能编译通过吗,why?

        //不能 静态的方法是不能重写的

3)题3,思考: abstract private void test30;能编译通过吗,why?

        //不能 除了public以外都不行

4)编写一个Employee类,声明为抽象类,包含如下三个属性: name, id, salary.提供必要的构造器和抽象方法: work0. 对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。请使用继承的思想,设计CommonEmployee类和Manager类.要求类中提供必要的方法进行属性访问,实现work().提示"经理/普通员工名字工作中....


    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}
class Maanager extends Employee{
    private double bonus;

    public Maanager(String name, String id, double salary, double bonus) {
        super(name, id, salary);
        this.bonus = bonus;
    }

    public void work(){
        System.out.println("经理 " + getName() + "正在工作中");
    }
}
class CommonEmployee extends Employee{
    public void work(){
        System.out.println("普通员工 " + getName() + "正在工作中");
    }

    public CommonEmployee(String name, String id, double salary) {
        super(name, id, salary);
    }
}

 

五、模版设计模式

需求

1.有多个类,完成不同的任务job

2.要求统计各自得到各自完成任务的时间

3.编程实现

引出模版设计模式

public class TestTemplate {
    public static void main(String[] args) {
        AA aa = new AA();
        aa.job();
        BB bb = new BB();
        bb.job();
    }
}

class AA {

    public void job() {

        //得到开始的时间
        long start = System.currentTimeMillis();
        long num = 0;
        for (long i = 0; i < 1000000; i++) {
            num += i;
        }
        //得到结束的时间
        long end = System.currentTimeMillis();
        System.out.println("执行时间" + (end - start) + "ms");
    }
    public void job2(){
        //得到开始的时间
        long start = System.currentTimeMillis();
        long num = 0;
        for (long i = 0; i < 3000000; i++) {
            num += i;
        }
        //得到结束的时间
        long end = System.currentTimeMillis();
        System.out.println("执行时间" + (end - start) + "ms");
    }
}

class BB {
    public void job() {

        //得到开始的时间
        long start = System.currentTimeMillis();
        long num = 0;
        for (long i = 0; i < 2000000; i++) {
            num += i;
        }
        //得到结束的时间
        long end = System.currentTimeMillis();
        System.out.println("执行时间" + (end - start) + "ms");
    }
}

        如果在每个单类里面写job和计算时间的代码块,复用性会很差,所以就引出模版设计,设计一个父类,里面塞进去共有的计算时间的方法,然后塞入抽象job方法,因为每一个对象在运行的时候会从本类开始查找,所以构成了重写抽象job方法,所以这种设计理念就相当于把父类作为一个模版,其他继承。

所以改进该代码

public class TestTemplate {
    public static void main(String[] args) {
        AA aa = new AA();
        BB bb = new BB();
        aa.calWorkTime();
        bb.calWorkTime();
    }
}
abstract class Template{
    public abstract void job();
    public void calWorkTime(){
        long start = System.currentTimeMillis();
        job();//动态绑定机制,调用的是对象所在类内的方法,没有再往上查找
        long end = System.currentTimeMillis();
        System.out.println("执行时间" + (end - start) + "ms");
    }
}
class AA extends Template{

    public void job() {
        long num = 0;
        for (long i = 0; i < 1000000; i++) {
            num += i;
        }
    }
}
class BB extends Template{
    public void job() {
        long num = 0;
        for (long i = 0; i < 2000000; i++) {
            num += i;
        }
    }
}

        

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

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

相关文章

微信小程序OA会议系统个人中心授权登入

在我们的完成微信登入授权之前&#xff0c;首先我们要完成我们前面所写的代码&#xff0c;如果有不会的大家可以去看以下我发的前面几个文章链接我发下面了&#xff0c;各位加油&#xff01; 微信小程序OA会议系统数据交互-CSDN博客 微信小程序会议OA系统其他页面-CSDN博客 …

基于nodejs+vue视频网站的设计与实现mysql

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

机器学习---CNN(创建和训练一个卷积神经网络并评估其性能)上

1. cnn_operations模块 cnn_operations类 staticmethoddef calc_loss(Y, tilde_Y):# 训练样本个数n_samples Y.shape[0]# 网络代价loss 0for i in range(n_samples):loss np.sum((Y[i, :] - tilde_Y[i, :])**2)loss / (2 * n_samples)return loss计算网络代价&#xff1a; …

编程自学路线:开源免费的教育资源 | 开源专题 No.40

trekhleb/javascript-algorithms Stars: 174.1k License: MIT 这个项目是一个包含许多流行算法和数据结构的 JavaScript 示例。该项目提供了各种不同类型的数据结构&#xff0c;如链表、队列、栈等&#xff0c;并且还提供了各种常见的算法实现&#xff0c;如排序算法、搜索算…

Kubernetes技术与架构-网络 3

Kubernetes集群支持为Pod或者Service申请IPV4或者IPV6的地址空间。 kube-apiserver --service-cluster-ip-range<IPv4 CIDR>,<IPv6 CIDR> kube-controller-manager --cluster-cidr<IPv4 CIDR>,<IPv6 CIDR> --service-cluster-ip-range<IPv4 CI…

Java switch封神之路

Java switch升级之路 一&#xff0c;介绍 switch 是一种用于多分支条件判断的控制流语句。它通过检查一个表达式的值&#xff0c;然后根据不同的情况执行相应的代码块。 在大多数编程语言中&#xff0c;switch 语句由多个 case 分支组成&#xff0c;每个 case 后面跟着一个常…

unity游戏画质设置功能实现

在游戏中往往会出现游戏画质设置的功能。 如图&#xff1a; 这个功能是怎么实现完成的呢&#xff1f; 一、目标&#xff1a;实现切换画质功能 二、了解unity支持的画质 首先要了解unity中共支持多少种画质。 在代码中也可以进行打印。 方法如下&#xff1a; void Start …

NC61 两数之和

牛客网 NC61 两数之和 https://www.nowcoder.com/share/jump/7890810391698077140732 记录&#xff1a;维护哈希表&#xff0c;题目满足&#xff0c;numbers内必有两数相加为target&#xff0c;则可理解为&#xff0c;每次只需要判断target减去当前数&#xff0c;是否能在维护的…

zookeeper源码(02)源码编译启动及idea导入

本文介绍一下zookeeper-3.9.0源码下载、编译及本地启动。 下载源码 git clone https://gitee.com/apache/zookeeper.gitcd zookeeper git checkout release-3.9.0 git checkout -b release-3.9.0源码编译 README_packaging.md文件 该文件介绍了编译zookeeper需要的环境和命…

【JavaEE】UDP数据报套接字编程

一、UDP数据报套接字编程 1.1 DatagramSocket API DatagramSocket 是UDP Socket&#xff0c;用于发送和接收UDP数据报。 DatagramSocket 构造方法&#xff1a; DatagramSocket 方法&#xff1a; 1.2 DatagramPacket API DatagramPacket是UDP Socket发送和接收的数据报。…

NAS搭建指南三——私人云盘

一、私人云盘选择 我选择的是可道云进行私人云盘的搭建可道云官网地址可道云下载地址&#xff0c;下载服务器端和 Windows 客户端可道云官方文档 二、环境配置 PHP 与 MySQL 环境安装&#xff1a;XAMPP 官网地址 下载最新的 windows 版本 安装时只勾选 MySQL 与 PHP相关即可…

sklearn-6算法链与管道

思想类似于pipeline&#xff0c;将多个处理步骤连接起来。 看个例子&#xff0c;如果用MinMaxScaler和训练模型&#xff0c;需要反复执行fit和tranform方法&#xff0c;很繁琐&#xff0c;然后还要网格搜索&#xff0c;交叉验证 1 预处理进行参数选择 对于放缩的数据&#x…

工程化测试:Apollo的单元测试与集成测试指南

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

vue后台第二部步(布局和封装图标组件)

目录结构&#xff1b;根据需求修改、创建对应目录&#xff1b; src 应用部署目录├─api 接口├─assets 公共文件│ ├─theme.scss 主题样式…

一文了解AIGC与ChatGPT

一、AIGC简介 1.AIGC基础 (1)AIGC是什么 AIGC是人工智能图形计算的缩写&#xff0c;是一种基于图形处理器&#xff08;GPU&#xff09;的计算技术&#xff0c;可以加速各种计算任务&#xff0c;包括机器学习、深度学习、计算机视觉等。 AIGC是一种基于GPU的计算技术&#x…

MSQL系列(七) Mysql实战-SQL语句Join,exists,in的区别

Mysql实战-SQL语句Join&#xff0c;exists&#xff0c;in的区别 前面我们讲解了索引的存储结构&#xff0c;BTree的索引结构&#xff0c;以及索引最左侧匹配原则及讲解一下常用的SQL语句的优化建议&#xff0c;今天我们来详细讲解一下 我们经常使用的 join&#xff0c; exist&…

【机器学习】模型平移不变性/等变性归纳偏置Attention机制

Alphafold2具有旋转不变性吗——从图像识别到蛋白结构预测的旋转对称性实现 通过Alphafold2如何预测蛋白质结构&#xff0c;看有哪些机制或tricks可以利用&#xff1f; 一、等变Transformer 等变Transformer是Transformer众多变体的其中一种&#xff0c;其强调等变性。不变性…

基于Java的疫苗接种管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

面试题—JAVA基础①

文章目录 1.Java面向对象有哪些特征&#xff1f;2.ArrayList和LinkedList有什么区别&#xff1f;3.Java接口和抽象类有哪些区别&#xff1f;4.hashcode和equals如何使用&#xff1f;5.try-catch6.局部变量和实例变量7.String、StringBuffer、StringBuilder 的区别&#xff1f;8…