JAVA——抽象类

抽象类

Java中的抽象类是一种特殊的类,它不能被实例化,即不能直接创建对象,只能作为其他类的基类(父类)来使用。抽象类主要用于定义一些通用的属性和方法,这些方法可以在子类中得到具体的实现。

抽象类使用abstract关键字进行修饰。它可以有构造方法,用于初始化抽象类的实例变量。同时,抽象类可以包含抽象方法,这些抽象方法只有方法的签名,没有具体的实现,需要在子类中实现。子类在继承抽象类时,必须实现抽象类中的所有抽象方法,除非子类自身也被声明为抽象类。

抽象类的主要作用有:

  1. 类型隐藏:抽象类可以作为类型使用,将具体实现细节隐藏起来,只暴露必要的接口给使用者。
  2. 代码复用:通过继承抽象类,子类可以复用抽象类中定义的方法和属性,避免重复编写相同的代码。
  3. 强制子类实现特定方法:抽象类中的抽象方法要求子类必须实现,这可以确保子类具有某些必要的功能或行为。

下面是一个简单的抽象类定义示例:

public abstract class Animal {  // 抽象方法,没有方法体  public abstract void eat();  public abstract void sleep();  // 非抽象方法,有具体实现  public void makeSound() {  System.out.println("The animal makes a sound.");  }  
}

在这个例子中,Animal是一个抽象类,它定义了两个抽象方法eatsleep,以及一个非抽象方法makeSound。任何继承Animal类的子类都必须实现eatsleep方法,但可以直接使用makeSound方法,因为它已经有了具体的实现。

抽象类和普通类在面向对象编程中存在明显的区别

首先,普通类是可以被实例化的类,它们具有具体的实体,可以直接创建为对象,并且包含完整的实现细节。普通类可以定义属性、方法和构造函数等,并且可以被其他类继承。一旦普通类被实例化,其对象可以直接调用类中的方法和访问属性。普通类存在的意义就是为了实例化。

而抽象类则是一种特殊的类,它不能被实例化,即不能创建对象。抽象类主要用于定义一些通用的属性和方法,这些通用方法可以是具体的,也可以是抽象的。抽象方法使用abstract关键字进行修饰,只有方法的签名,没有具体的实现,需要由其子类提供具体的实现。一个含有抽象方法的类必须声明为抽象类。子类在继承抽象类时,必须实现抽象类中的所有抽象方法,除非子类自身也被声明为抽象类。抽象类存在的意义就是为了被继承,其子类可以重写父类的方法,或者为父类的抽象方法提供实现。抽象类的构造方法作用为初始化子类对象。

因此,普通类和抽象类的主要区别在于其是否可以实例化、是否有抽象方法的定义、以及它们在类层次结构中的使用方式。普通类更注重具体实现,而抽象类则更注重定义通用属性和方法,并强制子类实现特定的行为。

抽象类和接口

抽象类和接口在Java等面向对象编程语言中都是重要的概念,但它们之间存在一些关键的区别。

首先,抽象类和接口都不能被直接实例化,它们都是用于被其他类实现或者继承的。抽象类是对类的抽象,它表示的是“这个对象是什么”,而接口是对动作的抽象,表示的是“这个对象能做什么”。因此,抽象类主要关注一个事物的本质,而接口关注一个操作。

其次,抽象类和接口在包含的方法类型上有所不同。抽象类既可以包含抽象方法,也可以包含普通方法,提供部分实现。而接口只能包含抽象方法,不能包含普通方法。这意味着接口完全是对方法的声明,不提供任何实现,而抽象类则可以提供部分实现。

再者,抽象类和接口在定义属性方面也有所区别。接口中只能定义静态常量属性,不能定义普通属性。而抽象类既可以定义普通属性,也可以定义静态常量属性。

此外,抽象类可以有构造器,但接口中不包含构造器。抽象类中的构造器不是用于创建对象,而是让子类调用这些构造器来完成属于抽象类的初始化工作。

最后,从使用角度来看,一个类只能继承一个抽象类(单继承),但可以实现多个接口(多继承)。这意味着抽象类的功能要远超过接口,但定义抽象类的代价也相对较高,因为需要编写和继承出所有子类的共性。而接口则提供了更灵活的扩展性,通过实现多个接口,一个类可以具有多种不同的行为。

 

举例看看:

// 定义一个抽象类  
abstract class Animal {  // 抽象类中的普通成员变量  private String name;  // 抽象类中的普通方法  public void setName(String name) {  this.name = name;  }  public String getName() {  return name;  }  // 抽象方法,子类必须实现  public abstract void makeSound();  
}  // 定义一个接口  
interface Movable {  // 接口中的方法默认是抽象的  void move();  
}  // 定义一个类,继承抽象类Animal并实现接口Movable  
class Dog extends Animal implements Movable {  // 实现抽象类Animal中的抽象方法  @Override  public void makeSound() {  System.out.println("The dog barks.");  }  // 实现接口Movable中的方法  @Override  public void move() {  System.out.println("The dog runs.");  }  
}  // 主类,用于测试  
public class Main {  public static void main(String[] args) {  // 创建Dog类的实例  Dog dog = new Dog();  // 设置名字  dog.setName("Buddy");  // 调用继承自Animal的getName方法  System.out.println("Dog's name: " + dog.getName());  // 调用实现自Animal的makeSound方法  dog.makeSound();  // 调用实现自Movable的move方法  dog.move();  }  
}

在这个例子中,Animal 是一个抽象类,它有一个普通成员变量 name 和一个普通方法 setName/getName,还有一个抽象方法 makeSoundMovable 是一个接口,它定义了一个抽象方法 move

Dog 类继承了 Animal 类,并实现了 Movable 接口。因此,Dog 类必须实现 Animal 类中定义的抽象方法 makeSound 和 Movable 接口中定义的 move 方法。

在 Main 类的 main 方法中,我们创建了 Dog 类的实例,并调用了它的方法。这展示了如何在一个类中同时继承抽象类和实现接口,并提供了这些方法的具体实现。

这个例子清晰地展示了抽象类和接口在Java中的区别和用法:抽象类可以包含普通方法和抽象方法,而接口只能包含抽象方法;一个类可以继承一个抽象类,但可以实现多个接口。

总的来说,Java中的抽象类是一种强大的工具,它允许我们定义通用的属性和方法,并在子类中实现具体的行为,从而提高了代码的复用性和可维护性。

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

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

相关文章

通过iptables限制docker 容器的运行端口

通过在iptables DOCKER-USER 添加规则,即可实现所有外部网络都无法访问docker中的服务: iptables -I DOCKER-USER -i enp0s3 -j DROP 规则:所有从外部网络进入的数据包,直接被丢弃。 DOCKER-USER链是上述FORWARD链中第一个规则匹…

java案例-读取xml文件

需求 导入依赖 <dependencies><!-- dom4j --><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency> </dependencies>代码 SAXReader saxReade…

进迭时空宣布开源RISC-V芯片的AI核心技术

仟江水商业电讯&#xff08;4月29日 北京 委托发布&#xff09;4月29日&#xff0c;在“创芯生生不息——进迭时空2024年度产品发布会”上&#xff0c;进迭时空CEO、创始人&#xff0c;陈志坚博士宣布将开源进迭时空在自研RISC-V AI CPU上的核心技术&#xff0c;包括AI扩展指令…

无人机+集群组网+单兵图传:空地一体化组网技术详解

空地一体化组网技术是一种结合了无人机、集群自组网和单兵图传等多种技术的先进通信解决方案。这种技术方案的主要目的是在前线事故现场和后方指挥中心之间建立一个高效、稳定的通信链路&#xff0c;以确保信息的实时传输和指挥的顺畅进行。 首先&#xff0c;前端视频采集部分&…

自适应信号处理基础及应用——DSP学习笔记五

本专栏的图片内容都来自于老师讲课的PPT&#xff0c;本篇博客只是我个人对于上课内容的知识结构分析和梳理。 导论 自适应系统的定义、特征、形式、举例 特征 非自适应系统 • 固定参数的设计方法 • 假定事先知道了一切可能的输入条件&#xff1b;在这些条件下怎样动作&#…

word 表格 文字 上下居中

问题 word 表格 文字 上下居中 详细问题 笔者进行word 文档编辑&#xff0c;对于表格中的文本内容&#xff0c;如何进行上下居中&#xff1f; 解决方案 步骤1、选中需要进行操作的单元格 步骤2、右键 → \rightarrow →点击表格属性 步骤3、依次点击单元格 → \rightar…

Qt绘图与图形视图之自定义图元实现拖拽、拉伸、旋转功能

往期回顾 Qt绘图与图形视图之移动鼠标手动绘制任意多边形的简单介绍-CSDN博客 Qt绘图与图形视图之场景、视图架构的简单介绍-CSDN博客 Qt绘图与图形视图之基本图元绘制的简单介绍-CSDN博客 Qt绘图与图形视图之自定义图元实现拖拽、拉伸、旋转功能 一、最终效果 实现对自定义图…

HTML中datalist的用法

在HTML中&#xff0c;<datalist>元素用于为<input>元素提供预定义的选项列表&#xff0c;供用户从中选择。通常&#xff0c;它配合<input>元素的list属性一起使用。以下是如何使用<datalist>元素的简单示例&#xff1a; <!DOCTYPE html> <h…

android studio SQLite数据库的简单使用

在Android Studio中使用数据库可以有多种方式&#xff0c;常见的几种方式包括使用SQLite数据库和使用 SQLite数据库 SQLite是一款轻量级的关系型数据库管理系统&#xff0c;在Android中被广泛使用。要在Android Studio中使用SQLite数据库&#xff0c;需要先创建一个数据库帮助…

leetcode刷题:两数之和

面试造火箭&#xff0c;工作拧螺丝&#xff0c;话虽如此&#xff0c;背背八股文&#xff0c;刷刷算法题&#xff0c;也可以提高自己的编程素养&#xff0c;一切目的是为了上岸&#xff0c;在此就不咬文嚼字&#xff0c;追求茴香豆的茴有几种写法了&#xff0c;换句话说&#xf…

vue2 通过设置devServer.port端口号,启动测试服务后端口失效/自动切换端口

vue2 设置端口号小于1990&#xff08;通过设置devServer.port&#xff09; 启动测试服务后端口失效/自动切换端口 问题描述 在配置文件vue.config.js中 module.exports {devServer: {host: localhost,port: 1890,// ...}项目创建后一直使用1890&#xff0c;能正常启动local…

官网设计UI设计需要考虑哪些?

响应式布局&#xff1a; 使用响应式设计技术&#xff0c;确保网站能够自动适应不同设备的屏幕大小和分辨率。这包括使用流式布局、弹性布局和媒体查询等技术。 移动优先&#xff1a; 采用移动优先的设计策略&#xff0c;即首先设计适用于小屏幕设备的界面&#xff0c;然后逐渐…

应用层协议了解

一 HTTP前置知识 这篇博客会有点长&#xff0c;但对我来说非常有意义&#xff0c;这是我从一无所知到理解网络的重大突破&#xff0c;在前两个月我对网络非常恐惧&#xff0c;还十分不理解什么是网络&#xff0c;什么是协议。接下来先介绍几个概念。 1 流量 我们把数据给别人&…

GitHub Desktop进行汉化

第一步下载github桌面版 官网&#xff1a;安装 GitHub Desktop - GitHub 文档 历史版本&#xff1a;https://github.cn.uptodown.com/windows/versions 本期下载版本3.3.11进行汉化&#xff0c;最新版不一定稳定。 网站打不开的可自取&#xff1a; 3.3.11版本安装包链接&a…

【论文笔记】Language Models are Few-Shot Learners B部分

Language Models are Few-Shot Learners B 部分 回顾一下第一代 GPT-1 &#xff1a; 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式&#xff1b;模型架构是基于 Transformer 的叠加解码器&#xff08;掩码自注意力机制、残差、Layernorm&#…

排序算法:插入、希尔、选择、推排、冒泡、快速、归并排序

排序算法 目录 前言 一、排序的概念 1.1排序的概念 1.2 常见的排序算法 二、常见排序算法的实现 2.1 插入排序 2.2 希尔排序 2.3 选择排序 2.4 堆排序 2.5 冒泡排序 2.6 快速排序 2.6.1 hoare版本 2.6.2 前后指针版本 2.6.3 非递归版本 2.7 归并排序 归并排序 2.8 计数排序 三、…

【mysql】mysql中的数据类型知多少?

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

RediSearch:Redis强大的搜索引擎

在现代应用程序开发中&#xff0c;高效的搜索功能是提升用户体验的关键因素之一。Redis&#xff0c;作为一款广泛使用的内存数据存储系统&#xff0c;以其高速、灵活的特点受到开发者青睐。然而&#xff0c;原生Redis并不支持复杂的数据搜索功能。为了填补这一空白&#xff0c;…

Golang Colly下载小红书详情页面图片小爬虫

语言:Golang 库:Iris/Colly 目前网上相关内容比较少,查了很久才找到解决方法。 期间曾尝试使用 selenium 解决,但需要搭建 selenium server,就没有再折腾了。 直到找到:https://juejin.cn/post/7230780828795584567 虽然不是Colly实现的,但起码提供了解决思路~~ 抱…

在VMware中如何快速克隆出一台虚拟机

鉴于经常需要使用新开虚拟机出来给开发团队用于测试部署&#xff0c;之前没有克隆功能之前都是需要一台装一个操作系统&#xff0c;无论是linux、windows server版或 windows 10 版&#xff0c;整个安装过程下来还是要一个来小时。后来做了装了十多次以后&#xff0c;想着试一下…