【Java基础】抽象类和接口的使用

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【JavaSE_primary】
本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区讨论💌

目录

  • 一、抽象类
    • 抽象类概念
    • 抽象类语法
    • 抽象类作用
  • 二、接口
    • 接口语法
    • 多接口
    • 接口间的继承
  • 三、抽象类和接口的区别

一、抽象类

抽象类概念

抽象类:我们通过前面面向对象的学习已经了解到:所有的对象都是通过类来描述的,但是如果反过来,并不是所有的类都是用来描述对象的。如果一个类中没有足够的信息来描述一个完整的对象,那么这个类我们称它为抽象类

抽象类语法

抽象类语法:

  • 抽象类使用abstract修饰
  • 抽象类包含普通类所能包含的成员
  • 抽象类之所以和普通类有所区别是因为抽象类中包含抽象方法
  • 抽象方法同样使用abstract进行修饰
  • 抽象类无法进行实例化
  • 抽象类存在的最大意义就是为了被继承
  • 如果一个普通类继承了抽象类,那么这个普通类必须对抽象类中的抽象方法进行重写
  • 如果抽象类A继承了抽象类B,则抽象类A不需要重写抽象类B中的抽象方法,但是如果抽象类A被普通类C继承,那么普通类C需要重写抽象类B的抽象方法
  • 抽象方法是不能私有的
  • 抽象方法没有加访问限定符时,默认是被public修饰的
  • 抽象方法无法被final和static修饰,因为抽象方法是要被重写的
  • 抽象类必须被继承,且子类必须重写抽象类的抽象方法,否则,这个子类必须也是一个抽象类。
  • 抽象类不一定要包含抽象方法,但是有抽象方法的类一定是抽象类
  • 抽象类中可以有构造方法,以便子类创建对象时可以初始化父类的成员变量(不要忘记抽象类是无法实例化的,之所以抽象类可以存在构造方法就是为了子类可以调用抽象类的构造方法来完成抽象类成员变量的初始化操作

这里解释下为什么抽象方法无法被static修饰当一个方法被声明为抽象方法时,它要求子类必须提供具体的实现。而静态方法是属于类的一部分,不涉及对象的实例化和继承,因此不能被重写。如果抽象方法允许被static修饰,那么就会导致无法在子类中重写或实现这个方法。

为什么抽象方法无法被final修饰:final修饰的方法无法被子类重写,而抽象方法又要求子类必须对齐(抽象方法)进行重写,二者相互冲突,所以抽象方法当然无法被final修饰了。

我们举一个简单的抽象类,请看:

abstract class Shape {private String color;public Shape(String color) {this.color = color;}// 抽象方法,需要子类实现public abstract double getArea();// 普通方法public String getColor() {return color;}
}

抽象类作用

我们已经知道抽象类是无法进行实例化的,如果想要使用抽象类必须在子类中重写抽象类的抽象方法才可以使用。

但是普通类中的方法也可以被重写啊,那为什么还要整个抽象类那么麻烦呢?原因是因为抽象类在在编译器角度来说相当于多了一重检查。
举个例子,如果我们写了一个普通类A,同时子类B继承了这个普通类A,那么无论我们在子类中是否重写普通类A中的成员方法编译器都不会进行报错的。相反如果是抽象类的话,如果我们没有在子类中实现抽象类的抽象方法的话编译器是会报错的。

所以,充分利用编译器的校检能力对于实际开发中是十分有必要的,可以让我们更早的检查到我们犯下的错误

二、接口

在Java中,接口是一种抽象类型,它定义了一组方法的规范,但没有提供这些方法的具体实现。接口可以看作是一种约定,它规定了实现该接口的类必须实现接口中声明的所有方法。

我们先来简单实现一个接口再回来讲解接口的语法,请看:

interface Myinterface{public static final int value = 10;// method1和method2均为抽象方法,实现这个接口的类需要提供具体的方法来实现// 接口中的方法均为抽象方法void method1();void method2(String str);// 如果非要在接口中具体实现一个方法的话需要用default来修饰此方法default public void func1(){System.out.println("default public void func1()");}// 接口中也可以存在静态方法public static void func2(){System.out.println("public static void func2");}
}class Myclass implements Myinterface{public void method1(){System.out.println("method1方法必须进行重写");}public void method2(String str){System.out.println("method2方法必须进行重写");}public void fun1(){System.out.println("此方法的重写可以进行选择,既可以重写也可以不重写");}
}

接口语法

接口语法如下:

  • 使用interface来修饰接口
  • 接口中的方法不能有具体的实现(即接口中的方法必须为抽象方法),接口中的方法默认是public abstract修饰;从JDK1.8开始允许有可以有具体实现的方法,但是此方法必须由default修饰;接口中可以存在静态方法
  • 接口中的成员变量默认由public static final修饰
  • 接口无法实例化
  • 类和接口之间使用implements来实现多个接口。
  • 我们可以选择性的重写接口中由default修饰的方法

下面来举一个例子以便大家理解:

interface Animal{void whichAnimal();
}
class Cat implements Animal{@Overridepublic void whichAnimal() {System.out.println("我是一只猫咪");}
}
class Dog implements Animal{@Overridepublic void whichAnimal() {System.out.println("我是哈士奇");}
}
class Sheep implements Animal{@Overridepublic void whichAnimal() {System.out.println("我是喜羊羊");}
}
public class Test2 {public static void whoAnimal(Animal animal){animal.whichAnimal();}public static void main(String[] args) {Cat cat = new Cat();whoAnimal(cat);whoAnimal(new Dog());whoAnimal(new Sheep());}
}

结果演示:
在这里插入图片描述

多接口

在Java中,一个类可以继承多个接口,使用implements修饰,并用逗号,隔开。(这样可以解决Java多继承的问题)

请看多接口继承的例子:

interface Engine {void start();void stop();
}
interface Navigation {void navigate();
}
interface MusicPlayer {void playMusic();
}
// 定义 Car 类实现 Engine、Navigation 和 MusicPlayer 接口
class Car implements Engine, Navigation, MusicPlayer {@Overridepublic void start() {System.out.println("启动发动机");}@Overridepublic void stop() {System.out.println("停止发动机");}@Overridepublic void navigate() {System.out.println("导航中");}@Overridepublic void playMusic() {System.out.println("播放音乐");}
}public class Main {public static void main(String[] args) {Car car = new Car();car.start();car.stop();car.navigate();car.playMusic();}
}

接口间的继承

java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承,所以接口间的继承解决了多继承的目的。

接口继承的优势在于,它可以通过组合不同的接口来实现一种类似多继承的行为。一个类可以实现多个接口,从而获得多个接口中定义的方法和常量,将多个不同接口的特性组合到一个类中。

下面是一个多接口继承的例子,请看:

interface A {void methodA();
}interface B extends A {void methodB();
}interface C {void methodC();
}interface D extends B, C {void methodD();
}class MyClass implements D {@Overridepublic void methodA() {System.out.println("方法A");}@Overridepublic void methodB() {System.out.println("方法B");}@Overridepublic void methodC() {System.out.println("方法C");}@Overridepublic void methodD() {System.out.println("方法D");}
}

类通过多接口继承可以获得多个接口中方法和常量的能力,同时也展示了接口之间的继承关系可以形成层次结构。通过接口的多继承和继承链,我们可以在类中组合多个接口的行为,实现更高级别的抽象和模块化的设计。

三、抽象类和接口的区别

抽象类和接口的区别如下:

  • 抽象类中可以包好普通类所能包含的成员方法;但是接口中的方法必须是抽象的
  • 抽象类中的成员变量可以是各种类型的;但是接口中的成员变量必须是public static final修饰的
  • 抽象类只能单继承;但是接口是可以做到多实现的,从而达到多继承的效果

好了,本文就这到这里啦,再见啦友友们!!!

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

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

相关文章

无设计经验也能制作专业国庆微传单

如果你正在计划一个国庆活动,或者想要创建一个微传单来宣传你的品牌或产品,那么你可以尝试使用乔拓云微传单平台。通过这个平台,你可以轻松地创建和发布一个精美的微传单,而且完全免费。 以下是制作国庆微传单H5的步骤&#xff1a…

react的组件

组件 组件是用来实现局部功能的代码和资源的集合(html/css/js),用来复用代码。 react中分为函数式组件和类式组件。函数式组件就是一个函数,函数的返回值就是组件的视图内容。类式组件就是通过class关键字创建的类,类…

力扣每日一题(+日常水几题)

121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09;(很水) class Solution { public:int maxProfit(vector<int>& prices) {int ans 0;int pre prices[0];for(auto & x : prices){pre min(pre,x);ans max(ans, x - pre);}return ans;} }; 64…

stl格式-3D三角形

文章目录 什么是stl文件?格式首选stl的语法1.这是一个stl格式的文件:(ASCII码)2.下面先举个例子(难度略微提示)补充:关于\<\<我试了一下:这个法线你随便写好像也没问题\>> 3.来个立方体4.最后再写一个由三个直角形组成的立方体(直棱锥)5.amend 修正(右手定则,法线…

Java 多态

Java 多态 目录 Java 多态 实例 虚方法 多态是同一个行为具有多个不同表现形式或形态的能力。 多态性是对象多种表现形式的体现。 比如我们说"宠物"这个对象&#xff0c;它就有很多不同的表达或实现&#xff0c;比如有小猫、小狗、蜥蜴等等。那么我到宠物店说&q…

决策树剪枝:解决模型过拟合【决策树、机器学习】

如何通过剪枝解决决策树的过拟合问题 决策树是一种强大的机器学习算法&#xff0c;用于解决分类和回归问题。决策树模型通过树状结构的决策规则来进行预测&#xff0c;但在构建决策树时&#xff0c;常常会出现过拟合的问题&#xff0c;即模型在训练数据上表现出色&#xff0c;…

【ArcGIS Pro二次开发】(69):使用MapTool实现隐藏和隔离图层

一、MapTool简介 在ArcGIS Pro SDK中&#xff0c;MapTool是一个重要的组件&#xff0c;用于自定义地图操作工具&#xff0c;使用户能够在ArcGIS Pro中执行特定的地图交互操作。 在VS中添加新项&#xff0c;可以找到ArcGIS Pro 地图工具&#xff0c;即为MapTool。 新建后打开c…

HNU-CSer的推免经历记录

写在前面 本篇不是一个经验贴&#xff0c;不包含任何考核的具体内容。关于本校本年的推免情况&#xff0c;一些准备资料和我校主要推免到的学校的基本情况介绍我正在整理&#xff0c;后续完成后会放链接到这里&#xff08;也是因为一部分这个原因才决定写这一篇&#xff0c;同学…

站点信息搜集

站点信息搜集 1. whatweb 工具 kali自带的工具, 命令: whatweb httpbin.org http://httpbin.org [200 OK] Country[UNITED STATES][US], Email[mekennethreitz.org], HTML5, HTTPServer[gunicorn/19.9.0], IP[54.161.141.91], JQuery, Script[text/javascript], Title[ht…

javaee SpringMVC 乱码问题解决

方法一 在web.xml文件中注册过滤器 <!-- 注册过滤器 设置编码 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param&…

优雅的写Controller 层代码这样写才可以

前 言 本篇主要要介绍的就是controller层的处理&#xff0c;一个完整的后端请求由4部分组成&#xff1a; 接口地址(也就是URL地址)请求方式(一般就是get、set&#xff0c;当然还有put、delete)请求数据(request&#xff0c;有head跟body)响应数据(response) 本篇将解决以下3个…

Vue+element开发Simple Admin后端管理系统页面

最近看到各种admin&#xff0c;头大&#xff0c;内容太多&#xff0c;根本不知道怎么改。所以制作了这个项目&#xff0c;只包含框架、和开发中最常用的表格和表单&#xff0c;不用自己从头搭建架构&#xff0c;同时也容易上手二次开发。可以轻松从其他开源项目整合到本项目。项…

基于Qt Creator开发的坦克大战小游戏

目录 介绍开发环境技术介绍安装说明项目目录设计思想项目介绍运行演示知识点记录Gitee源码链接 介绍 &#xff01;&#xff01;&#xff01;资源图片是从网上免费下载&#xff0c;源码都是原创&#xff0c;供个人学习使用&#xff0c;非盈利&#xff01;&#xff01;&#xff…

UE5报错及解决办法

1、编译报错&#xff0c;内容如下&#xff1a; Unable to build while Live Coding is active. Exit the editor and game, or press CtrlAltF11 if iterating on code in the editor or game 解决办法 取消Enable Live Coding勾选

Java编码

Java编码问题 Unicode与码点 所谓Unicode就是全世界的字符字典&#xff0c;也就是把字符给一个编号&#xff0c;这个编码就是码点。比如 2. 编码 由于这种分配的编码无论从占用空间角度&#xff0c;还是读取速度&#xff0c;以及逻辑划分角度&#xff0c;都不是完善。所以出…

【Java-LangChain:面向开发者的提示工程-7】文本扩展

第七章 文本扩展 扩展是将短文本&#xff08;例如一组说明或主题列表&#xff09;输入到大型语言模型中&#xff0c;让模型生成更长的文本&#xff08;例如基于某个主题的电子邮件或论文&#xff09;。这种应用是一把双刃剑&#xff0c;好处例如将大型语言模型用作头脑风暴的伙…

了解”变分下界“

“变分下界”&#xff1a;在变分推断中&#xff0c;我们试图找到一个近似概率分布q(x)来逼近真实的概率分布p(x)。变分下界是一种用于评估近似概率分布质量的指标&#xff0c;通常用来求解最优的近似分布。它的计算涉及到对概率分布的积分或期望的估计

分布式搜索引擎es-3

文章目录 数据聚合聚合的种类RestAPI实现聚合 自动补全自定义拼音分词器自动补全查询案例&#xff1a;实现酒店搜索框自动补全自动补全的javaAPI实现搜索框自动补全 口述自动补全数据同步集群集群的分布式存储集群分布式查询集群故障转移 数据聚合 什么是聚合&#xff1f; 聚合…

【面试经典150 | 矩阵】旋转图像

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;原地旋转方法二&#xff1a;翻转代替旋转 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带…

【Cesium创造属于你的地球】相机系统

相机系统里面有setView&#xff0c;flyTo&#xff0c;lookAt&#xff0c;viewBoundingsphere这几种方法&#xff0c;以下是相关的使用方法&#xff0c;学起来&#xff01;&#xff01;&#xff01; setView 该方法可以直接切换相机视口&#xff0c;从而不需要通过一个飞入的效…