Java抽象类

ops/2024/9/23 11:13:05/

1. 抽象类

1.1 抽象类概念

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的。

一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

在打印图形例子中, 我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由 Shape 的各种子类的 draw 方法来完成的. 像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstract method), 包含抽象方法的类我们称为 抽象类(abstract class) 

1.2 抽象类语法

在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用 给出具体的实现体。

java">abstract class Shape {public String name;public int age;public static void func() {}public  abstract void draw();
}

注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法 

1.3 抽象类特性 

1. 抽象类不能直接实例化对象

java">Shape shape = new Shape();
// 编译出错
Error:(30, 23) java: Shape是抽象的; 无法实例化

2. 抽象方法不能是 private 的

java">abstract class Shape {
abstract private void draw();
}
// 编译出错
Error:(4, 27) java: 非法的修饰符组合: abstract和private

 3. 抽象方法不能被final和static修饰,因为抽象方法要被子类重写

java">public abstract class Shape {
abstract final void methodA();
abstract public static void methodB();
}
// 编译报错:
// Error:(20, 25) java: 非法的修饰符组合: abstract和final
// Error:(21, 33) java: 非法的修饰符组合: abstract和static

4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修 饰

java">abstract class Shape {/*public String name;public int age;public static void func() {}*/public  abstract void draw();
}class Rect extends Shape {@Overridepublic void draw() {System.out.println("画一个矩形!");}
}
class Triangle extends Shape {@Overridepublic void draw() {System.out.println("画一个三角形!");}
}class Cycle extends Shape {@Overridepublic void draw() {System.out.println("画一个圆圈!");}
}public class Test {public static void drawMap(Shape shape) {shape.draw();}public static void main(String[] args) {Shape shape = new Cycle();drawMap(new Cycle());drawMap(new Rect());drawMap(new Triangle());}
}

 5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类

java">abstract class Shape {public  abstract void draw();//可有没有这串
}

6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

 7. 当一个普通类A 继承了一个抽象类,不想重写这个抽象类的方法,此时,可以把这个普通类A改为抽象类。但是如果A这个抽象类再次被普通类B继承,此时B这个类需要重写所有未被重写的抽象方法!

java">abstract class Shape {public  abstract void draw();
}abstract class A extends Shape {public abstract void testA();
}
class B extends A {@Overridepublic void draw() {}@Overridepublic void testA() {}
}

总结:


1.一个方法可以被修饰为abstract,此时代表这个方法可以不进行实现。此时被称为抽象方法!
2.如果一个类当中 包含抽象方法,此时这个类必须是抽象类。没有抽象方法,这个类也可以被写为抽象类!
问题:什么情况下 一个类 可以被定义为抽象类?
答:当不能描述具体的一个对象的时候

3.抽象类当中 定义的成员 和普通类没有区别。
4.抽象类不可以被实例化
问题:抽象类 不可以被实例化 那么 存在的意义是什么?
答:为了被继承

5.当一个普通类继承这个抽象类之后,必须重写抽象类当中的抽象方法!
6.抽象类也可以发生向上转型,动态绑定,多态!
7.此时抽象方法也需要满足重写的特点。被static 、final、private修饰都是不能发生重载的!
可以理解为: abstract 和 final 是对立的

8.当一个普通类A 继承了一个抽象类,不想重写这个抽象类的方法,此时,可以把这个普通类A改为抽象类。但是如果A这个抽象类再次被普通类B继承,此时B这个类需要重写所有未被重写的抽象方法!


1.4 抽象类的作用

抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法

用于拓展对象的行为功能:
这一组任意个可能的具体实现表现为所有可能的子类,模块可以操作一个抽象类,由于模块依赖于一个固定的抽象类,那么他是不允许修改的。同时通过这个抽象类进行派生,拓展此模块的行为功能。


http://www.ppmy.cn/ops/3670.html

相关文章

K8S 哲学 - yaml文件

selector: Pod 对象不应该有 selector 字段。selector 字段通常用于 Service、Deployment、ReplicaSet 等对象,用于选择匹配的 Pod。在 Pod 对象中,这个字段是无效的 apiVersion: apps/v1 kind: Deployment metadata: name: gyk labels: …

Labview2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 LabVIEW是一种由美国国家仪器(NI)公司开发的程序开发环境,它显著区别于其他计算机语言,如C和BASIC。传统的计算机语言是基于文本的语言来产生代码,而LabVIEW则采用图形化…

stm32实现hid鼠标

启动CubelMX 选择芯片(直接输入stm32f103zet6) 设置时钟 如下图 usb设置 配置usb设备 调试端口设置 配置时钟 项目输出设置 打开工程(后记:此工程含有中文不能编译通过) 配置项目 配置调试器 编译无法通过 删除路径中的中文,以及…

Ceph [OSDI‘06]论文阅读笔记

原论文:Ceph: A Scalable, High-Performance Distributed File System (OSDI’06) Ceph简介及关键技术要点 Ceph是一个高性能、可扩展的分布式文件系统,旨在提供出色的性能、可靠性和可扩展性。为了最大化数据和元数据管理的分离,它使用了一…

相机摄影入门技巧,数码摄影技巧大全

一、资料前言 本套数码相机摄影资料,大小1.08G,共有42个文件。 二、资料目录 《aking人像摄影技巧分享》.pdf 《Nikon.D90数码单反摄影技巧大全》FUN视觉.全彩版.pdf 《不可不学的摄影技巧》.pdf 《常用场景摄影》.pdf 《单反数码摄影专家技法》.…

MySQL 8.0 vs MySQL 5.7: 详细比较

MySQL 8.0 vs MySQL 5.7: 详细比较 MySQL是世界上最流行的开源关系数据库之一,随着技术的进步,每个新版本都带来了许多重要的更新和改进。在本文中,我们将深入探讨MySQL 8.0和5.7两个版本之间的主要差异,涵盖从性能改进、新特性到…

Qt中定时器的3种实现方法

一.使用QTimer定时器类(首选) 1.示例代码: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); ui->setupUi(this); time1 new QTimer(); time1->setInterval(1000…

Android11应用安装未知来源的权限改动

最近开发的App需要下载安装另一个App。这就涉及到了app的安装代码。关于App的安装代码,写了不少,所以这一块觉得不是问题: 判断版本,Android8.0判断是否有未知来源安装全选,没有则打开未知来源安装权限设置界面去开启…