面向对象进阶--抽象(Java 抽象)详解

1.1 抽象类引入

父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了(因为子类对象会调用自己重写的方法)。换句话说,父类可能知道子类应该有哪个功能,但是功能具体怎么实现父类是不清楚的(由子类自己决定),父类只需要提供一个没有方法体的定义即可,具体实现交给子类自己去实现。我们把没有方法体的方法称为抽象方法。Java语法规定,包含抽象方法的类就是抽象类

  • 抽象方法 : 没有方法体的方法。

  • 抽象类:包含抽象方法的类。

在没有学抽象方法的时候,之前我们的父类都是写一些简单的程序,但如果子类不重写父类的方法的话,就会出些弊端

1.2abstract使用格式

abstract是抽象的意思,用于修饰方法方法和类,修饰的方法是抽象方法,修饰的类是抽象类。

使用abstract关键词,子类会强制重写,否则报错,抽象方法所在的类就是抽象类

使用abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。

抽象方法  

定义格式:  

修饰符 abstract 返回值类型 方法名 (参数列表);

代码举例:

public abstract void run()

抽象类

如果一个类包含抽象方法,那么该类必须是抽象类。注意:抽象类不一定有抽象方法,但是有抽象方法的类必须定义成抽象类。

定义格式:

abstract class 类名字 { 
  
}

代码举例

public abstract class Animal {
    public abstract void run();
}

抽象类的使用

要求:继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。

1.抽象类不能实例化

测试类

public class Test {public static void main(String[] args) {//创建对象//1.抽象类不能实例化//Person p=new Person();}
}

子类

public abstract class Person {public abstract void work();}

2.抽象类中不一定有抽象方法,但是有抽象方法的一定有抽象类

public abstract class Person {// public abstract void work();public void show(){System.out.println("睡觉");}}

3.可以有构造方法

public abstract class Person {public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}

}

 4.

抽象类写了一个抽象方法

public abstract class Person {public abstract void work();public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}private  String name;private  int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

 抽象的子类重新了抽象中的所有的抽象方法

package abstractdemo01;public class Student extends Person {@Overridepublic void work() {System.out.println("学生的工作就是学习");}public Student() {}public Student(String name, int age) {super(name, age);}
}

测试类

public class Test {public static void main(String[] args) {Student s = new Student("zhangsan", 18);System.out.println(s.getAge() + " " + s.getName());}
}

练习

父类 animal

package abstractdemo02;public abstract class animal {private String name;private int age;public animal() {}public animal(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public void dirk(){System.out.println("动物在喝水");}public abstract void eat();
}

子类Dog 

package abstractdemo02;public class Dog extends animal{@Overridepublic void eat() {System.out.println("狗在吃骨头");}public Dog() {}public Dog(String name, int age) {super(name, age);}
}

子类Frog 

package abstractdemo02;public class  Frog extends animal{@Overridepublic void eat() {System.out.println("青蛙在吃虫子");}public Frog() {}public Frog(String name, int age) {super(name, age);}
}

 子类Sleep

package abstractdemo02;public class Slepp extends animal{@Overridepublic void eat() {System.out.println("山羊吃艹");}public Slepp() {}public Slepp(String name, int age) {super(name, age);}
}

测试类 

package abstractdemo02;public class Test {public static void main(String[] args) {Frog f = new Frog("zhangsan",18);System.out.println(f.getAge()+" "+f.getName());f.eat();System.out.println("----------");Dog d = new Dog("lisi",19);System.out.println(d.getAge()+" "+d.getName());d.eat();System.out.println("----------");Slepp s = new Slepp("wangwu",20);System.out.println(s.getAge()+" "+s.getName());s.eat();}
}

此时的方法重写,是子类对父类抽象方法的完成实现,我们将这种方法重写的操作,也叫做实现方法

抽象类的特征

抽象类的特征总结起来可以说是 有得有失

有得:抽象类得到了拥有抽象方法的能力。

有失:抽象类失去了创建对象的能力。

其他成员(构造方法,实例方法,静态方法等)抽象类都是具备的

抽象类的细节

不需要背,只要当idea报错之后,知道如何修改即可。

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

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

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

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

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

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

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

  4. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则子类也必须定义成抽象类,编译无法通过而报错。

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

  5. 抽象类存在的意义是为了被子类继承。

    理解:抽象类中已经实现的是模板中确定的成员,抽象类不确定如何实现的定义成抽象方法,交给具体的子类去实现。

抽象类存在的意义

抽象类存在的意义是为了被子类继承,否则抽象类将毫无意义。抽象类可以强制让子类,一定要按照规定的格式进行重写。

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

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

相关文章

流媒体学习之路(WebRTC)——音频NackTracker优化思路(8)

流媒体学习之路(WebRTC)——音频NackTracker优化思路(8) —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实…

数据结构——排序(期末总结)

1. 插入排序 1.1 直接插入排序 思想 假设第一个元素是已经排好序的元素&#xff0c;从第二个元素开始依次插入操作&#xff0c;大的放后面&#xff0c;小的放前面。 代码 void insert(int a[], int n) {int i, j, key;for (i 2; i < n; i){key a[i];j i - 1;while (j…

百度网盘 url 正则表达式

匹配 https://pan.baidu.com/s/1NmVIJiI2Ot8MkI-vxxNPTg?pwdxxxx https://pan.baidu.com/s/[a-zA-Z0-9\-]*(\?pwd[a-zA-Z0-9]{4})?该正则表达式匹配以 https:// 开头&#xff0c;后面跟着 pan.baidu.com/s/ 或 yun.baidu.com/s/&#xff0c;最后跟着一串由大小写字母、数字…

kotlin集合框架

1、集合框架的接口类型对比 2、不可变和可变List fun main() {// 不可变List - 不能删除或添加元素val intList: List<Int> listOf(1,2,3)intList.forEach{println(it) // 1 2 3}println("")// 可变List - 可以删除或添加元素val mutableList mutableListO…

SSL证书怎样配置部署更安全?

在互联网上&#xff0c;SSL证书是用于加密网站与用户之间传输的数据的一种数字证书。它通过建立安全的连接&#xff0c;确保网站的身份和保护用户的隐私&#xff0c;是网站安全的重要组成部分。然而&#xff0c;要想让SSL证书发挥最大的作用&#xff0c;除了检查证书是否过期外…

【Apple Vision pro 应用】Orbital Beats-重塑音乐创作与体验的创新混合现实之旅

轨道节拍:重塑音乐创作与体验的创新混合现实之旅 灵感之源 Orbital Beats 诞生于一个宏大的愿景——革新音乐创作与体验的方式。我们渴望打破传统界限,让用户在视觉沉浸的虚拟环境中与音乐亲密互动。通过直观的手势操控声音,我们期待每个人都能轻松融入音乐创作的世界,无论…

目标检测——YOLOv10算法解读

论文&#xff1a;YOLOv10: Real-Time End-to-End Object Detection (2024.5.23) 作者&#xff1a;Ao Wang, Hui Chen, Lihao Liu, Kai Chen, Zijia Lin, Jungong Han, Guiguang Ding 链接&#xff1a;https://arxiv.org/abs/2405.14458 代码&#xff1a;https://github.com/THU…

深入理解抽象工厂模式:概念与金融行业应用

前言 在软件开发过程中&#xff0c;设计模式提供了解决特定问题的通用方案。抽象工厂模式是一种创建型设计模式&#xff0c;它为创建一系列相关或相互依赖的对象提供了一个接口&#xff0c;而无需指定它们的具体类。本文将详细介绍抽象工厂模式的概念、结构和应用&#xff0c;…

C++ | Leetcode C++题解之第165题比较版本号

题目&#xff1a; 题解&#xff1a; class Solution { public:int compareVersion(string version1, string version2) {int n version1.length(), m version2.length();int i 0, j 0;while (i < n || j < m) {long long x 0;for (; i < n && version1[…

【OpenHarmony开发】自定义系统应用之实践

前言 OpenHarmony系统应用是指预装在OpenHarmony操作系统中的应用程序&#xff0c;也称为系统应用。这些应用程序通常由操作系统开发者开发&#xff0c;包括系统设置、电话、短信、浏览器、相机、音乐、视频等常用应用程序。这些应用程序通常具有更高的权限和更深入的系统集成…

机器学习参数寻优:方法、实例与分析

机器学习参数寻优:方法、实例与分析 机器学习模型的性能很大程度上依赖于其参数的选择。参数寻优(Hyperparameter Tuning)是提升模型表现的关键步骤之一。本文将详细介绍主流的参数寻优方法,包括网格搜索(Grid Search)、随机搜索(Random Search)、贝叶斯优化(Bayesia…

Skype机器人

这段代码是一个Skype机器人,它使用OpenAI的GPT模型来回答与基督教相关的问题。机器人会读取最近的聊天历史,生成一个回复,并发送给用户。以下是对代码每一部分的详细解释: 导入模块 import json import http.client from skpy import SkypeEventLoop, SkypeNewMessageEve…

反激开关电源EMI电路选型及计算

EMI &#xff1a;开关电源对电网或者其他电子产品的干扰 EMI &#xff1a;传导与辐射 共模电感的滤波电路&#xff0c;La和Lb就是共模电感线圈。这两个线圈绕在同一铁芯上&#xff0c;匝数和相位都相 同(绕制反向)。 这样&#xff0c;当电路中的正常电流&#xff08;差模&…

磁盘阵列的介绍

前言 Linux磁盘阵列&#xff08;RAID&#xff09;是一种数据存储技术&#xff0c;它通过组合多个物理磁盘来创建一个逻辑磁盘&#xff0c;从而提供更高的存储性能、数据冗余和容错能力。 以下是关于磁盘阵列的介绍&#xff1a; 一、RAID定义与原理 RAID&#xff08;Redunda…

三十分钟学会RabbitMQ

1、初识MQ 1.1 MQ是什么&#xff1f; MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中…

VMare连接Centos7无法连接网络

VMare连接Centos7无法连接网络 打开ifcfg-ens33文件检查ONBOOT是否为yes&#xff0c;如果是no需要修改成yes vi /ect/syscong ig/network-scripts/ifcfg-ens33 保存后输入ip a命令&#xff0c;能看到自己的ip就是成功了 ip就是成功了

---

author: xiaodaidai created: 2024/6/20 00:39:06 aliases: 夜晚随想录 description:大晚上睡不着&#xff0c;就想写一点东西 tags:日记 心情 夜晚随想录 关键字 生活、学习、爱情、夜晚、思考 概述和背景 在这个不眠的夜晚&#xff0c;我躺在床上&#xff0c;思绪如同夜…

MapReduce笔记

第1章 MapReduce概述 1.1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个H…

构建Java微服务架构的实用指南

构建Java微服务架构的实用指南 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 随着云计算和分布式系统的迅猛发展&#xff0c;微服务架构已经成为了构建大型应…

Ubuntu 24.04 安装 libaio1 和 libaio-dev

Ubuntu 24.04 安装 libaio1 curl -O http://launchpadlibrarian.net/646633572/libaio1_0.3.113-4_amd64.debsudo dpkg -i libaio1_0.3.113-4_amd64.deb sudo apt-get install libaio-dev # for oracle linux # sudo dnf install libaio-develrefer: https://community.localwp…