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

news2024/11/26 22:32:59

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【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{

    @Override
    public void whichAnimal() {
        System.out.println("我是一只猫咪");
    }
}
class Dog implements Animal{

    @Override
    public void whichAnimal() {
        System.out.println("我是哈士奇");
    }
}
class Sheep implements Animal{

    @Override
    public 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 {
    @Override
    public void start() {
        System.out.println("启动发动机");
    }

    @Override
    public void stop() {
        System.out.println("停止发动机");
    }

    @Override
    public void navigate() {
        System.out.println("导航中");
    }

    @Override
    public 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 {
    @Override
    public void methodA() {
        System.out.println("方法A");
    }

    @Override
    public void methodB() {
        System.out.println("方法B");
    }

    @Override
    public void methodC() {
        System.out.println("方法C");
    }

    @Override
    public void methodD() {
        System.out.println("方法D");
    }
}

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

三、抽象类和接口的区别

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

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

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

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

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

相关文章

头条号热点采集工具-头条号热文采集软件

有一种魔法,能让信息传遍大地,让新闻在互联网上迅速传播,引发关注和讨论,那就是头条热点。无论你是一名自媒体创作者,还是一个信息追踪者,头条热点都是你不能忽视的宝贵资源。然而,如何获取这些…

Linux关于gittee的远端仓库的连接和git三板斧

目录 1.网页操作 2.Linux操作 查看Linux系统中是否安装git指令 安装git指令 链接远端仓库 设置 .gitignore文件 3.git三板斧 1.网页操作 首先我们要在gittee建立一个仓库 这是我自己的勾选方案,大家可以参考一下。 这个方案勾选最下面的三个选项才有&#x…

博物馆门票预约APP的设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

【Unity3D日常开发】Unity3D的Resources不同目录的加载分析

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 xdm,国庆节快乐呀,无聊学习一会&#x…

Spring Cloud Loadbalancer 实现客户端负载均衡

针对 ribbon 负载均衡组件&#xff0c; 官方提出的替换解决方案是 Spring Cloud Loadbalancer。本次主要通过学习示例介绍了 Spring Cloud Loadbalancer 的基础使用。 1&#xff0c;引入pom <dependency><groupId>org.springframework.cloud</groupId><…

【LeetCode刷题笔记】一维数组

1.两数之和 解题思路&#xff1a; 哈希 &#xff0c;每次循环将 元素值 和对应 下标 放入 map 中&#xff0c;每次更新 map 之前先判断一下&#xff0c;如果 map 中已经包含 target - nums[i] 的 key &#xff0c;则找到答案&#xff0c;返回 当前下标 和之前的 key 对应的 下…

Unity自用工具:基于种子与地块概率的开放世界2D地图生成

public class BuildingGen : MonoBehaviour {public int[] Building;//存储要生成的地块代码public int[] Probability;//存储概率public double seed;public int width 100;public int height 100;public float noiseScale 0.1f; //噪声缩放倍数private int[,] frequencyM…

大模型 Decoder 的生成策略

本文将介绍以下内容&#xff1a; IntroductionGreedy Searchbeam searchSamplingTop-K SamplingTop-p (nucleus) sampling总结 一、Introduction 1、简介 近年来&#xff0c;由于在数百万个网页数据上训练的大型基于 Transformer 的语言模型的兴起&#xff0c;开放式语言生…

Ubuntu 20.04 安装部署 TiDB DM v7.3.0 集群【全网独家】

文章目录 测试环境说明TiDB 单机环境部署DM 集群部署1. 免密设置2. 组件下载3. DM 配置文件模板获取4.DM 配置文件设置5.部署与启动 DM 集群 前言&#xff1a; 放眼全网&#xff0c;我找不出一篇在 Ubuntu 里面搭建 DM 集群的文章&#xff0c;虽然 TiDB 官方推荐使用 CentOS 系…

模块化编程+LCD1602调试工具——“51单片机”

各位CSDN的uu们你们好呀&#xff0c;小雅兰又来啦&#xff0c;刚刚学完静态数码管显示和动态数码管显示&#xff0c;感觉真不错呢&#xff0c;下面&#xff0c;小雅兰就要开始学习模块化编程以及LCD1602调试工具的知识了&#xff0c;让我们进入51单片机的世界吧&#xff01;&am…

Python集成开发环境(IDE):WingPro for Mac

WingPro for Mac是一款Python集成开发环境&#xff08;IDE&#xff09;软件&#xff0c;它提供了一系列强大的工具和功能&#xff0c;帮助Python开发人员提高开发效率和质量。 WingPro for Mac拥有直观的用户界面和强大的调试器&#xff0c;可以帮助用户快速定位问题和修复错误…

二、机器学习基础知识:Python数据处理基础

文章目录 1、基本数据类型1.1 数字类型&#xff08;Number&#xff09;1.2 字符串类型&#xff08;String&#xff09;1.3 列表类型&#xff08;List&#xff09;1.4 元组类型&#xff08;Tuple&#xff09;1.5 字典类型&#xff08;Dictionary&#xff09;1.6 集合类型&#x…

力扣 -- 494. 目标和(01背包问题)

参考代码&#xff1a; 未优化的代码&#xff1a; class Solution { public:int findTargetSumWays(vector<int>& nums, int target) {int nnums.size();int sum0;for(const auto& e:nums){sume;}//aimbsum//aim-btarget//aim(sumtarget)/2int aim(sumtarget)/2…

利用EasyX绘制国旗

所谓国庆&#xff0c;举国同庆 今天我就来分享一下利用图形库来制作一个比例版缩小的五星红旗&#xff08;尽量精确了&#xff09; 需要利用到前边的知识note2基本图形的绘制 进入正题 五星红旗的长和高之比为三比二 创建一个长为960像素&#xff0c;宽为640像素的窗体 更…

【1++的Linux】之进程(五)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;什么是进程替换二&#xff0c;替换函数三&#xff0c;实现我们自己的shell 一&#xff0c;什么是进程替换 我们创建出来进程是要其做事情的&#xff0c;它可…

用类继承计算长方体体积

编写ClassA收集长、宽、高键盘输入&#xff0c;编写ClassB继承ClassA并拟方法计算长方体体积。 (本笔记适合正在研习Class类的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自…

入门运维之MySQL管理

一、系统数据库 Mysql数据库安装完成后,自带了以下四个数据库,具体作用如下: 1.1常用工具 1.1.1 mysql 该mysql不是指mysql服务,而是指mysql的客户端工具。 语法 :mysql [options] [database] 选项 :-u, --user=name #指定用户名-p, --password[=name] #指定密码-h,…

mfc140u.dll是什么文件?mfc140u放在哪个文件夹?详细修复教程

今天我想和大家分享一个非常常见的问题——mfc140u.dll丢失的困扰以及解决方法。 首先&#xff0c;让我们来了解一下什么是mfc140u.dll。这是一个非常重要的动态链接库文件&#xff0c;它是Microsoft Foundation Class Library的一个组件。许多软件和游戏都需要这个文件的支持才…

品牌数字人IP如何从虚拟到现实快速出圈?

在数智化时代&#xff0c;数字人如何赋能品牌IP&#xff0c;为品牌挖掘出更多的增长机会&#xff1f;近日&#xff0c;纯甄馋酸奶官数字人“解小馋”以一支精致的CG视频正式亮相。 *图片源于网络 品牌数字人以CG动画可以让品牌形象更具象化&#xff0c;通过数字人三维动画的形…

前期开发用最内聚环境,最直观简单的方法管理代码

代码稍微一多我们就会思考代码如何去规划和管理&#xff0c;首先想到MVN等管理工具去帮助我们&#xff0c;结果配置了好长时间感觉不是很方便。首先因为没有系统去了解这个工具的使用方法&#xff0c;另外发现IDEA在原本松散的工具之间以插件的形式做了一定的配置&#xff0c;将…