【java】15:抽象类

当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法,这个方法就是抽象方法,用abstract来修饰该类就是抽象类。

//我们看看如何把Animal做成抽象类,并让子类Cat类实现。
abstract class Animal{
String name;
int age;
abstract public void cry();}

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

注意事项及讨论:

1)抽象类不能被实例化[举例]2)抽象类不一定要包含abstract方法。也就是说,抽象类可以没有abstract方法[举例]3)一旦类包含了abstract方法,则这个类必须声明为abstract[说明]4)abstract 只能修饰类和方法,不能修饰属性和其它的。[说明]

package com.hspedu.abstract_;
public class AbstractDetail01 {
public static void main(String[] args) {
//抽象类,不能被实例化
//new A();
}
}
//抽象类不一定要包含 abstract 方法。也就是说,抽象类可以没有 abstract 方法
//,还可以有实现的方法。
abstract class A {
public void hi() {
System.out.println("hi");
}
}
//一旦类包含了 abstract 方法,则这个类必须声明为 abstract
abstract class B {
public abstract void hi();
}
//abstract 只能修饰类和方法,不能修饰属性和其它的
class C {
// public abstract int n1 = 1;
}

5)抽象类可以有任意成员【抽象类本质还是类】,比如:非抽象方法、构造器、静态属性等等[举例]6)抽象方法不能有主体,即不能实现.如图所示tXIabstract void aaa()7)如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类。[举例A类,B类,C类]

package com.hspedu.abstract_;
public class AbstractDetail02 {
public static void main(String[] args) {
System.out.println("hello");
}
}
//抽象方法不能使用 private、final 和 static 来修饰,因为这些关键字都是和重写相违背的
abstract class H {
public abstract void hi();//抽象方法
}
//如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为 abstract 类
abstract class E {
public abstract void hi();
}
abstract class F extends E {
}
class G extends E {
@Override
public void hi() { //这里相等于 G 子类实现了父类 E 的抽象方法,所谓实现方法,就是有方法体

}
}
//抽象类的本质还是类,所以可以有类的各种成员
abstract class D {
public int n1 = 10;
public static String name = "韩顺平教育";
public void hi() {
System.out.println("hi");
}
public abstract void hello();
public static void ok() {
System.out.println("ok");
}
}
抽象类最佳实践 - 模板设计模式:
1.基本介绍:
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。
2 模板设计模式能解决的问题:
1)当功能内部一部分实现是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。2)编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式.
3. 最佳实践:
package com.hspedu.abstract_;
abstract public class Template { //抽象类-模板设计模式
public abstract void job();//抽象方法
public void calculateTime() {//实现方法,调用 job 方法
//得到开始的时间
long start = System.currentTimeMillis();
job(); //动态绑定机制
//得的结束的时间
long end = System.currentTimeMillis();
System.out.println("任务执行时间 " + (end - start));
}
}
package com.hspedu.abstract_;
public class AA extends Template {
//计算任务
//1+....+ 800000
@Override
public void job() { //实现 Template 的抽象方法 job
long num = 0;
for (long i = 1; i <= 800000; i++) {
num += i;
}
}
// public void job2() {
// //得到开始的时间
// long start = System.currentTimeMillis();
// long num = 0;
// for (long i = 1; i <= 200000; i++) {
// num += i;
// }
// //得的结束的时间
// long end = System.currentTimeMillis();
// System.out.println("AA 执行时间 " + (end - start));
// }
}
package com.hspedu.abstract_;
public class BB extends Template{
public void job() {//这里也去,重写了 Template 的 job 方法
long num = 0;
for (long i = 1; i <= 80000; i++) {
num *= i;
}
}
}
package com.hspedu.abstract_;
public class TestTemplate {
public static void main(String[] args) {
AA aa = new AA();
aa.calculateTime(); //这里还是需要有良好的 OOP 基础,对多态
BB bb = new BB();
bb.calculateTime();
}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++精简版回顾】12.友元函数

1.友元函数 1.class class MM { public:MM(int age,string name):age(age),name(name){}friend void print(MM mm); private:int age;string name;void print() {cout << age << "岁的" << name << "喜欢你" << endl;} }; f…

k8s 进阶实战笔记 | NFS 动态存储类的部署与使用

文章目录 NFS 动态存储类的部署与使用演示环境说明NFS subdir external provisioner准备 NFS 服务器手动部署 NFS Subdir External Provisioner部署 StorageClass验证使用更多信息 NFS 动态存储类的部署与使用 演示环境说明 演示环境信息&#xff1a;单机K3s 1.28.2 操作系统…

Ansible 简介安装

1、概念介绍 Ansible 是一款为类 Unix 系统开发的自由开源的配置和自动化工具。由 Red Hat 公司使用 python 研发&#xff0c;类似于 saltstack 和 Puppet&#xff0c;但是有一个不同和优点是我们不需要在节点中安装任何客户端。它使用 SSH 来和节点进行通信。Ansible 基于 Py…

信号系统之FFT卷积

1 Overlap-Add 方法 在许多 DSP 应用中&#xff0c;长信号必须分段过滤。例如&#xff0c;高保真数字音频需要大约 5 MB/min 的数据速率&#xff0c;而数字视频需要大约 500 MB/min 的数据速率。在数据速率如此之高的情况下&#xff0c;计算机通常没有足够的内存来同时保存要处…

【程序员英语】【美语从头学】初级篇(入门)(笔记)Lesson 16 At the Shoe Store 在鞋店

《美语从头学初级入门篇》 注意&#xff1a;被 删除线 划掉的不一定不正确&#xff0c;只是不是标准答案。 文章目录 Lesson 16 At the Shoe Store 在鞋店对话A对话B笔记会话A会话B替换 Lesson 16 At the Shoe Store 在鞋店 对话A A: Do you have these shoes in size 8? B:…

SQLlabs46关

看看源码 最终我们的id是放到order by后面了 如果我们直接用列去排序 ?sortusername/password username&#xff1a; passward 可以看到顺序是不同的&#xff0c;当然第一列第二列第三列也可以&#xff0c;基本上都是这个原理&#xff0c;那怎么去实现注入呢&#xff0c;我…

Qt程序设计-钟表自定义控件实例

本文讲解Qt钟表自定义控件实例。 效果如下: 创建钟表类 #ifndef TIMEPIECE_H #define TIMEPIECE_H#include <QWidget> #include <QPropertyAnimation> #include <QDebug> #include <QPainter> #include <QtMath>#include <QTimer>#incl…

leetcode hot100 买卖股票的最佳时机1

本题之前采用贪心算法来解决&#xff0c;现在可以采用动态规划来解决&#xff0c;通过dp数组记录每次的状态从而获取到最大的利润。 这里dp数组定义为二维数组 dp[price.length][2]&#xff0c;其中price.length表示第i天&#xff0c;[2]其中有0/1两种状态&#xff0c;[0]表示…

设计模式(五)-观察者模式

前言 实际业务开发过程中&#xff0c;业务逻辑可能非常复杂&#xff0c;核心业务 N 个子业务。如果都放到一块儿去做&#xff0c;代码可能会很长&#xff0c;耦合度不断攀升&#xff0c;维护起来也麻烦&#xff0c;甚至头疼。还有一些业务场景不需要在一次请求中同步完成&…

【LeetCode】【滑动窗口长度不固定】978 最长湍流子数组

1794.【软件认证】最长的指定瑕疵度的元音子串 这个例题&#xff0c;是滑动窗口中长度不定求最大的题目&#xff0c;在看题之前可以先看一下【leetcode每日一题】【滑动窗口长度不固定】案例。 题目描述 定义&#xff1a;开头和结尾都是元音字母&#xff08;aeiouAEIOU&…

python 基础知识点(蓝桥杯python科目个人复习计划51)

今日复习计划&#xff1a;做复习题 例题1&#xff1a;大石头的搬运工 问题描述&#xff1a; 在一款名为“大石头的搬运工”的游戏中&#xff0c;玩家需要 操作一排n堆石头&#xff0c;进行n - 1轮游戏。 每一轮&#xff0c;玩家可以选择一堆石头&#xff0c;并将其移动到任…

【自然语言处理四-从矩阵操作角度看 自注意self attention】

自然语言处理四-从矩阵操作角度看 自注意self attention 从矩阵角度看self attention获取Q K V矩阵注意力分数softmax注意力的输出再来分析整体的attention的矩阵操作过程从矩阵操作角度看&#xff0c;self attention如何解决问题的&#xff1f;W^q^ W^k^ W^v^这三个矩阵怎么获…

安装使用zookeeper

先去官网下载zookeeper&#xff1a;Apache ZooKeeper 直接进入bin目录&#xff0c;使用powerShell打开。 输入: ./zkServer.cmd 命令&#xff0c;启动zookeeper。 zookeeper一般需要配合Dubbo一起使用&#xff0c;作为注册中心使用&#xff0c;可以参考另一篇博客&#xf…

从零开始掌握Docek的基础知识与应用技巧

目录 前言 一.docekr简介 二.docker的环境搭建 查看内核 更新yum源为最新 ​编辑 安装Docker所需要的工具包 设置yum源 下载docker ​编辑 启动Docker并且设置开机自启动 配置镜像仓库 三.docker命令 1.基本命令 2.常用命令 3.docker容器常用命令 Docker创建并启动…

Java中使用Graphics2D实现图片添加文字/图片水印

场景 java实现给图片添加水印实现步骤&#xff1a; 获取原图片对象信息&#xff08;本地图片或网络图片&#xff09; 添加水印&#xff08;设置水印颜色、字体、坐标等&#xff09; 处理输出目标图片。 注&#xff1a; 博客&#xff1a;霸道流氓气质-CSDN博客 实现 1、…

Parquet 文件生成和读取

文章目录 一、什么是 Parquet二、实现 Java 读写 Parquet 的流程方式一&#xff1a;遇到的坑&#xff1a;坑1&#xff1a;ClassNotFoundException: com.fasterxml.jackson.annotation.JsonMerge坑2&#xff1a;No FileSystem for scheme "file"坑3&#xff1a;与 spa…

020—pandas 根据历史高考分段推断当前位次的分数

前言 每年各省都会公布高考「一分一段」表&#xff0c;它是是以「一分」为单位&#xff0c;统计考得该分数的考生人数和累计人数&#xff0c;每一个分数段上有多少人一目了然。考生通过分数分布表可以查询到相关成绩在全市的排名位次&#xff0c;方便对自己进行定位。本例中&a…

嵌入式学习 Day 25

1.线程分离属性: 线程结束后,自动回收线程空间 pthread_attr_init int pthread_attr_init(pthread_attr_t *attr); 功能: 线程属性初始化 pthread_attr_destroy int pthread_attr_destroy(pthread_attr_t *attr); 功能: 线程属性销毁 pthread_attr…

计算机网络实验一 ENSP模拟器使用

实验一 eNSP模拟器的使用 学习目标&#xff1a; 1&#xff09;掌握eNSP模拟器的基本设置方法 2&#xff09;掌握使用eNSP搭建简单的端到端&#xff08;主机&#xff09;网络的方法 3&#xff09;掌握在eNSP中使用wireshark捕获IP报文的方法 4&#xff09;掌握设备的基本配置方…

内网穿透的应用-如何在群晖配置WebDAV实现云同步Zotero科研文献与笔记【内网穿透】

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…
最新文章