抽象类和接口的简单认识

news2024/11/27 5:41:27

目录

一、抽象类

1.什么是抽象类

2.抽象类的注意事项

3.抽象类与普通类的对比

二、接口

1.接口的简单使用

2.接口的特性

3.接口的使用案例

4.接口和抽象类的异同

一、抽象类

所谓抽象类,就是更加抽象的类,也就是说,这个类不能具体描述某一个对象。

1.什么是抽象类

1.1.引入

下面这是一个子类继承父类,并且重写父类中的eat方法。 

class Animal {
    public String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println("正在吃……");
    }
}
class dog extends Animal {

    public dog(String name) {
        super(name);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"正在吃奥里给!");
    }
}
public class Test {

    public static void main(String[] args) {
        Animal animal = new dog("旺财");
        animal.eat();

    }
}

运行结果:

我们可以发现,父类的eat方法似乎没有什么作用,也不能具体表现某一个具体动物。那我们可不可以不实现父类的eat方法呢?答案当然是可以的。

1.2.抽象方法与类引入

我们在上面的代码进行改进

上述操作完成一个抽象类和抽象方法的撰写。

1.3.抽象类的语法

一个方法没有实现,就需要用abstract修饰;如果一个类包含了抽象方法,那么这个类也必须用abstract修饰。 

(1)抽象方法

在修饰符后面,方法返回值前面加上abstract关键字,也可以不加修饰符

(2)抽象类

在class后面加上abstract关键字

2.抽象类的注意事项

抽象类和普通的类没有什么区别。但是可以比普通类多了抽象方法(可以不实现),也比普通类多了abstract关键字。

abstract class Animal {
    public String name;

    public Animal(String name) {
        this.name = name;
    }
    public abstract void eat();
}
class dog extends Animal {

    public dog(String name) {
        super(name);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"正在吃奥里给!");
    }
}
public class Test {

    public static void main(String[] args) {
        

    }
}

 继续使用上面的代码进行验证。

2.1.抽象类不能实例化

(1)实例化就会报错

(2)原因

因为抽象类不能具体表现一个对象,也就无法实例化

(3)用法

所以,抽象类的出现一般都要配合子类一起出现,借助子类来实例化对象。说明:抽象类一般都是发生在继承的继承上,同样可以发生向上转转型。

2.2.子类继承抽象类的注意点

(1)一个普通类,继承了这个抽象类,那么这个普通类就必须重写抽象类中的抽象方法。

(2)当抽象类中有构造方法,子类也需要调用构造方法来帮助父类进行初始化。

2.3.关于抽象类的语法

(1)抽象方法必须被重写,因此不能被private或final或static修饰

(2)抽象类中,可以有普通的成员变量和成员方法。

(3)A、B都是抽象类,B继承了A。此时有一个普通类C继承了B,C类要重写A、B中的所有抽象方法。(C->B->A)

2.4.抽象类的作用

(1)抽象类的出现,相当于给编译器加上了一层校验。

(2)原因:当子类继承父类时,编译器都会提醒编译器需要重新抽象方法(为后面的多态打下基础)

3.抽象类与普通类的对比

类/异同普通类抽象类
构造方法
普通成员变量
普通成员方法
抽象方法
实例化允许不允许

二、接口

接口就是抽象类的进一步抽象。接口也是一组公共的规范,如果需要使用接口,就需要蹲守接口的一系列规范

1.接口的简单使用

1.1.生活接口举例

如:电脑的USB口,只要符合该接口的规范,就可以插入;又如:电源插座插孔,符号其规范就可以插入,像电脑、电视机、电饭煲等等符合规范的设备

1.2.接口的语法

(1)和定义类进行类比,定义接口只需要把class关键字替换成 interface 即可

(2)定义接口位置

 

这种定义方式只需要输入接口名字就可以生成接口;如果不选择也可以,但是要自己定义interface+接口名字的形式去定义。

以上就定义好了两个接口,接口中的成员方法和成员变量下面接着讲解。


1.3.接口的成员变量与方法

(1)成员变量

以上原因是什么呢?我们使用idea的功能:Alt+Ins可以生成解决方案

原来是要先赋值,那原因是什么呢?变量初始化时必须赋值的指明该变量被final修饰,不能被修改。

接口中的成员变量特点:

默认被public static final修饰

去掉后

所以,成员变量初始化必须要赋值。定义格式:类型+变量名 = 值

(2)成员方法

显示报错,提示说抽象方法不能被实现

这样就不会再报错,并且没有具体实现的方法,不应该加上abstract修饰吗?看上面,pubblic字体暗了,说明接口的方法默认都是:public abstract修饰的 

那接口的成员方法一定不能被实现吗?那倒未必。

1)被static修饰的方法可以被实现

2)被default修饰的成员方法可以实现

default一般是默认的修饰符,也就是不写的时候,但是这里是必须要显示的写出default

1.4.接口的实现

(1)接口不能实例化

接口和抽象类都是不能直接实例化的,所以需要借助子类来完成实例化

(2)子类继承接口

继承接口要使用implements关键字,而不是extends 

上面显示报错,因为继承父类的抽象方法需要子类重写

子类实例化

但是一般都不会这样使用接口

以上粗略介绍了接口的一些定义、定义内容、和实现的写法,下面先介绍接口的特性,也就是接口的特点。

2.接口的特性

2.1.关于接口的定义

(1)接口定义的时候要使用 interface 关键字来定义

(2)接口中的成员变量,默认都是 public  static final 修饰的;所以定义成员变量的格式为:类型+变量名字 = 初始值;

(3)接口中的成员方法没有实现时,都默认是抽象方法;也就是成员方法默认是 public abstract 修饰的,所以定义成员方法的格式:返回值类型 + 方法名字();

(4)成员方法如果要实现,必须被static 或者 default 修饰

(5)接口名字命名推荐:首字母用大写I,后面跟上接口名字,接口名字首字母也大写

2.2.接口的继承和实现

(1)接口是不能被实例化的

(2)当一个类实现接口的时候,需要使用implements关键字,并且实现之后,要重写接口中的抽象方法

(3)一个类可以实现多个接口(解决了Java中不能多继承的缺点)

(4)继承和实现的顺序:继承类要在实现接口的前面。一个类可以继承一个普通类/抽象类 同时还可以实现多个接口

(5)接口当中不能有静态代码块和构造方法

(6)重写接口当中的抽方法时,只能使用默认的访问权限

(7)接口的生成的字节码文件后缀也是.class

3.接口的使用案例

(1)三个接口

(2)一个抽象类

(3)子类1继承实现

子类2:

(4)main方法实现

运行结果: 

(5)代码

public abstract class Animal {
    public String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(this.name+"正在吃");
    }
}
class Dog extends Animal implements IRun,ISwim {


    public Dog(String name) {
        super(name);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"正在吃狗粮");
    }

    @Override
    public void run() {
        System.out.println(this.name+"正在用四条腿跑……");
    }

    @Override
    public void swim() {
        System.out.println(this.name+"正在用四条腿游泳……");
    }
}
class Duck extends Animal implements IRun,ISwim,IFly {

    public Duck(String name) {
        super(name);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"正在吃鸭粮");
    }

    @Override
    public void run() {
        System.out.println(this.name+"正在用两个脚跑……");
    }
    @Override
    public void swim() {
        System.out.println(this.name+"正在用两条腿游泳……");
    }
    @Override
    public void fly() {
        System.out.println(this.name+"正在用两个翅膀飞……");
    }
}
public interface IRun {
    void run();
}
public interface IFly {
    void fly();
}
public interface ISwim {
    void swim();
}
public class Test {
    public static void eat(Animal animal) {
        animal.eat();
    }
    public static void fly(IFly fly) {
        fly.fly();
    }
    public static void main(String[] args) {
        Dog dog = new Dog("旺财");
        Duck duck = new Duck("唐老鸭");
        eat(dog);
        eat(duck);

        fly(duck);
    }
}

4.接口和抽象类的异同

4.1.相同点

(1)都有抽象方法

(2)都不能实例化对象

4.2.不同点

(1)抽象类中可以包含普通方法和普通字段,这些普通方法和普通字段在子类中可以直接使用,不必重写;但是接口中不能包含普通方法,子类必须重写所有的抽象方法

(2)一个普通类只能继承一个抽象类,但是可以实现多个接口


以上就是抽象类和接口的全部内容了。

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

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

相关文章

雷卯有多种接口与电源保护方案

在当今的电子设备中,各种接口和电源保护至关重要。它们不仅关乎设备的正常运行,更直接影响到数据传输的稳定性和设备的安全。雷卯公司以其专业的技术和丰富的经验,为您提供全面的接口与电源保护方案,确保您的系统安全稳定运行。 …

图像分割论文阅读:Automatic Polyp Segmentation via Multi-scale Subtraction Network

这篇论文的主要内容是介绍了一种名为多尺度差值网络(MSNet)的自动息肉分割方法。 1,模型整体结构 整体结构包括编码器,解码器,编码器和解码器之间是多尺度差值模块模块(MSM),以及一…

golang grpc和protobuf的版本降级问题(version4 -> version3)

最后更新于2024年3月28日 10:57:52 简中没查到类似的文章。一点小事闹麻了,搞了一天,特意发出来造福大家。 所谓的版本就是下面这个东西proto.ProtoPackageIsVersion4或者proto.ProtoPackageIsVersion3: 目的 为了适配旧代码&#xff0c…

探索c++:string常用接口 迷雾

个人主页:日刷百题 系列专栏:〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 🌎欢迎各位→点赞👍收藏⭐️留言📝 ​ ​ 一、string类 这里我们对string类进行一个简单的总结: string是表示字符串的字…

蓝桥小白入门赛6

原题链接:第 6 场 小白入门赛 - 蓝桥云课 目录 A、元宵节快乐 B、猜灯谜 C、数学奇才 D、你不干?有的是帕鲁干! E、等腰三角形 F、 计算方程 A、元宵节快乐 签到题 print("Today AK!") B、猜灯谜 模拟,特判下…

容器四(Map 接口)

目录 HashMap 和 HashTable Map 接口中的常用方法 HashMap 底层实现 Hashmap 基本结构 存储数据过程 put(key,value) 取数据过程 get(key) 扩容问题 JDK8 将链表在大于 8 情况下变为红黑二叉树 Map 就是用来存储“键(key)-值(value) 对”的。 Map 类中存储的…

《科技创新与应用》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答: 问:《科技创新与应用》是什么级别期刊? 答:省级;主管单位:黑龙江省科学技术协会;主办单位:黑龙江省创联文化传媒有限公司 问:《科技创新与应用》是核心期刊…

链游系统开发运营版丨链游系统开发指南教程

在当今数字经济时代,区块链技术的发展不仅改变了金融行业,也深刻影响了游戏产业。链游系统(Blockchain Game System)作为区块链技术与游戏行业的结合,正在成为新一代游戏的趋势。本文将为您详细介绍链游系统的开发与运…

2024年【N1叉车司机】考试技巧及N1叉车司机复审考试

题库来源:安全生产模拟考试一点通公众号小程序 N1叉车司机考试技巧参考答案及N1叉车司机考试试题解析是安全生产模拟考试一点通题库老师及N1叉车司机操作证已考过的学员汇总,相对有效帮助N1叉车司机复审考试学员顺利通过考试。 1、【多选题】《中华人民…

南京观海微电子---Vitis HLS的工作机制——Vitis HLS教程

1. 前言 Vitis HLS(原VivadoHLS)是一个高级综合工具。用户可以通过该工具直接将C、 C编写的函数翻译成HDL硬件描述语言,最终再映射成FPGA内部的LUT、DSP资源以及RAM资源等。 用户通过Vitis HLS,使用C/C代码来开发RTL IP核&#x…

思通数科:利用开源AI能力引擎平台打造企业智能搜索系统

在信息爆炸的时代,如何高效地管理和检索海量数据已成为企业和个人面临的一大挑战。思通数科 StoneDT 多模态AI能力引擎平台,以其强大的自然语言处理(NLP)、OCR识别、图像识别和文本抽取技术,为用户带来了前所未有的智能…

第N6周:使用Word2vec实现文本分类

import torch import torch.nn as nn import torchvision from torchvision import transforms,datasets import os,PIL,pathlib,warnings #忽略警告信息 warnings.filterwarnings("ignore") # win10系统 device torch.device("cuda"if torch.cuda.is_ava…

深入探索Yarn:安装与使用指南

Yarn 是一个由 Facebook 开发的 JavaScript 包管理器,旨在提供更快、更可靠的包管理体验。它与 npm 类似,但在某些方面更加高效和可靠。本文将介绍如何安装 Yarn,并展示如何使用它来管理 JavaScript 项目的依赖。 1. 安装 Yarn Yarn 可以通…

vs2022 关于Python项目无法识别中文的解决方法

这是针对于vs2022安装和使用教程(详细)-CSDN博客 Python项目无法识别中文的解决方法的文章 一、问题 1.输入代码 print("你好Hello world!") 2.启动,发现代码里有中文报错 二、解决方法 1.选择菜单栏里的工具->…

阿里云服务器ECS经济型e和u1实例规格如何选择?

阿里云服务器u1和e实例有什么区别?ECS通用算力型u1实例是企业级独享型云服务器,ECS经济型e实例是共享型云服务器,所以相比较e实例,云服务器u1性能更好一些。e实例为共享型云服务器,共享型实例采用非绑定CPU调度模式&am…

线程的等待通知机制

线程的等待通知机制 一:情景再现:二:等待通知机制:2.1 wait()方法2.2 notify()方法2.22:唤醒了t2线程,t1线程仍处于阻塞等待状态2.23 唤醒了t1线程,t2线程仍处于阻塞等待状态2.24:notifyAll() 一:情景再现: 假设有3个滑稽,1号滑稽在ATM中取钱,2,3号滑稽只能在门口阻塞等待,1号…

VuePress基于 Vite 和 Vue 构建优秀框架

VitePress 是一个静态站点生成器 (SSG),专为构建快速、以内容为中心的站点而设计。简而言之,VitePress 获取用 Markdown 编写的内容,对其应用主题,并生成可以轻松部署到任何地方的静态 HTML 页面。 VitePress 附带一个用于技术文档…

Vmware下减小Ubuntu系统占用系统盘大小

1、虚拟机设置下占用空间 如图,给虚拟机分配了120GB,已经占用116.9GB,开机会提示空间不足。 2、实际使用空间 ubuntu系统下使用“df -h”命令查看实际使用空间大小50GB左右 造成这个原因是,虚拟机的bug:在虚拟机的ub…

【递归】有序分数(SBT)

给定一个整数 N,请你求出所有分母小于或等于 N,大小在 [0,1][0,1] 范围内的最简分数,并按从小到大顺序依次输出。 例如,当 N5时,所有满足条件的分数按顺序依次为: 0/1,1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4…

二叉树寻找祖先问题-算法通关村

二叉树寻找祖先问题-算法通关村 1 最近公共祖先问题 LeetCode236:给定一个二叉树,找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为:“对于有根树T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足是…