java------抽象类和接口【详解】

news2024/9/28 9:21:31

目录

一.抽象类

1.1抽象类的定义:

 1.2抽象类的语法:

1.3 抽象类的特性:

 二.接口

2.1接口概念:

2.2 接口的语法:

2.3接口的使用:

 2.4接口的特性:

2.5多个接口的实现: 

2.6抽象类和接口的区别


一.抽象类

1.1抽象类的定义:

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的, 如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类 。 比如:

 说明:

  • 矩形,圆形,三角形都是图形,因此和Graph类的惯性应该是继承关系
  • 虽然图形中Graph也存在draw()的方法,但由于Graph类并不是具体的图形,因此其内部的draw()方法实际是没有办法实现的
  • 由于Graph类没有办法描述一个具体的图形,导致其draw()方法无法具体实现,因此可以将Graph类设计为“抽象类”
在上述图形例子中 , 我们发现 , 父类  Graph 中的 draw 方法好像并没有什么实际工作 , 主要的绘制图形都是由  Graph的各种子类的 draw () 方法来完成的 . 像这种没有实际工作的方法 , 我们可以把它设计成一个 抽象方法 (abstract method) , 包含抽象方法的类我们称为 抽象类 (abstract class)

 1.2抽象类的语法:

  • Java中一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体
// 抽象类:被abstract修饰的类
 abstract class Graph {
// 抽象方法:被abstract修饰的方法,没有方法体
abstract public void draw();
abstract void calcArea();
// 抽象类也是类,也可以增加普通方法和属性
public double getArea(){
return area;
}
protected double area; // 面积
}

 注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法

1.3 抽象类的特性:

  1.   抽象类不能直接实例化对象
  2. 抽象方法不能是 private
  3. 抽象方法不能被 final static 修饰,因为抽象方法要被子类重写
  4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰 
  5.   抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
  6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

代码示例: 

//抽象类的创立
abstract class Graph{
    abstract  public void draw();//抽象方法
    abstract public void calArea();

    double area;//抽象类也是类,也可以增加普通方法和属性
    public double getArea(){
        return area;
    }
}
//抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,以完成子类的特有属性
class Rect extends Graph{
    public double length;//子类中也能定义除了抽象类以外的方法和属性
    public double width;

    public Rect(double length,double width){
        this.length=length;
        this.width=width;
    }

    public void draw(){//子类的方法
        System.out.println("矩形:length="+length+" "+"width="+width);
    }
    public void calArea(){
        area=length*width;
        System.out.println("areaRect="+area);
    }
}
//抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,以完成子类的特有属性
class Circle extends Graph{
    public double r;
    public static double PI=3.14;
    public Circle(double r){
        this.r=r;
    }

    public void draw(){//抽象类的方法必须重写
        System.out.println("圆:r="+r);
    }
    public void calArea(){
        area=PI*r*r;
        System.out.println("areaCircle="+area);
    }
}

public class Main {
    public static void main(String[] args){
        //Graph Graph = new Graph();  抽象类虽然不能直接实例化
        //但可以把一个普通类对象传给一个抽象类的引用呀,即父类引用指向子类对象
        Rect rect=new Rect(20,30);
        rect.draw();
        rect.calArea();
        System.out.println("");//打印换行

        Circle circle=new Circle(5);
        circle.draw();
        circle.calArea();
    }
}

 二.接口

2.1接口概念:

  • 官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)
  • 通俗的讲:接口可以理解为一种特殊的类,里面全部是由全局常量公共的抽象方法所组成。接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的。或者我们可以直接把接口理解为100%的抽象类,既接口中的方法必须全部是抽象方法。(JDK1.8之前可以这样理解)

2.2 接口的语法:

上面提到,接口可以理解为一种特殊的类,接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。

interface 接口名称{
//抽象方法
void method1();
void method2();
void method3();
……
}

说明:

1. 创建接口时, 接口的命名一般以大写字母 I 开头.
2. 接口的命名一般使用 "形容词" 词性的单词.
3. 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性.

2.3接口的使用:

接口不能直接使用,必须要有一个"实现类""实现"该接口,实现接口中的所有抽象方法。 

class 类名称 implements 接口名称{
//接口方法的实现
……
}

 注意:子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系。

代码示例:

interface USB{//定义一个USB接口
    void openDevice();//里面包含两个待实现的方法,分别是打开和关闭设备
    void closeDevice();
}
// 鼠标类,实现USB接口
 class Mouse implements USB{
     public void openDevice(){//接口方法的重写
         System.out.println("打开鼠标");
     }
     public void closeDevice(){
         System.out.println("关闭鼠标");
     }
     public void click(){//除了接口以外自身的方法
         System.out.println("点击鼠标");
     }
}
// 键盘类,实现USB接口
class keyBoard implements USB{
     public void openDevice(){
         System.out.println("打开键盘");
     }
     public void closeDevice(){
         System.out.println("关闭键盘");
     }
     public void input(){
         System.out.println("键盘输入");
     }
}
// 笔记本类:使用USB设备
class Computer{
     public void powerOff(){
         System.out.println("关闭笔记本");
     }
     public void powerOn(){
         System.out.println("打开笔记本");
     }
//instanceof判断前面的对象是否属于后面的类,或者属于其子类
     public void useDevice(USB usb){
         usb.openDevice();//打开设备
         if(usb instanceof Mouse){
             Mouse mouse=(Mouse)usb;
             mouse.click();
         }else if(usb instanceof keyBoard){
             keyBoard keyboard=(keyBoard)usb;
             keyboard.input();
         }
         usb.closeDevice();//关闭设备
     }
}

public class Main{

public static void main(String[] args){
omputer computer=new Computer();//创建一个computer实例
         computer.powerOn();//执行开机

         computer.useDevice(new Mouse());//使用鼠标
         computer.useDevice(new keyBoard());//使用键盘
         computer.powerOff();//执行关机

       
}
}

 

 2.4接口的特性:

  • 接口类型是一种引用类型,但是不能直接 new 接口的对象
  • 接口中每一个方法都是 public 的抽象方法 , 即接口中的方法会被隐式的指定为 public abstract (只能是public abstract,其他修饰符都会报错 )
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
  • 重写接口中方法时,不能使用默认的访问权限
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
  • 接口中不能有静态代码块和构造方法 

2.5多个接口的实现: 

Java 中,类和类之间是单继承的,一个类只能有一个父类,即 Java 中不支持多继承 ,但是 一个类可以实现多个接 。 
代码示例:
class Animal{
     public String name;//定义一个动物类
     public Animal(String name){
         this.name=name;
     }
}
//定义多个接口
interface IFlying{
     void fly();
}

interface IRunning{
     void run();
}

interface ISwimming{
     void swim();
}
//在Cat中实现IRunning接口
class Cat extends Animal implements IRunning{
     public Cat(String name){
         super(name);
     }
     public void run(){
         System.out.println(this.name+"正在跑步~");
     }
}
//在Fish中实现ISwimming接口
class Fish extends Animal implements ISwimming{
     public Fish(String name){
         super(name);
     }
     public void swim(){
         System.out.println(this.name+"正在游泳~");
     }
}
//在Duck中实现ISwimming,IRunning,IFlying接口
class Duck extends Animal implements ISwimming,IRunning,IFlying{
     public Duck(String name){
        super(name);
     }

     public void swim(){
         System.out.println(name+"正在游泳~");
     }
     public void run(){
         System.out.println(name+"正在跑步~");
     }
     public void fly(){
         System.out.println(name+"正在飞~");
     }
}
public class Main{
public static void main(String[] args){
Cat cat=new Cat("xiaobao");//实现各个接口
         cat.run();

         Fish fish=new Fish("xioa");
         fish.swim();

         Duck duck=new Duck("yazi");
         duck.swim();
         duck.fly();
         duck.run();
} 
}

 

2.6抽象类和接口的区别

核心区别 : 抽象类中可以包含普通方法和普通字段 , 这样的普通方法和字段可以被子类直接使用 ( 不必重写 ), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法。
*相同点:
  • 都不能被实例化 ,接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

*不同点:

  • 抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;接口中的方法默认使用public修饰
  • 接口成员变量默认为public static final,必须赋初值,不能被修改。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;
  • 实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
  • 接口强调特定功能的实现,而抽象类强调所属关系。
  • 抽象类可以包含方法、构造方法,方法可以实现,但是构造方法不能用于实例化,主要用途是被子类调用。接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体

博客到这里也是结束了,制作不易,喜欢的小伙伴可以点赞加关注支持下博主,这对我真的很重要~~

 

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

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

相关文章

接口测试怎么测?接口测试的流程和步骤(超详细)

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,薪资嘎嘎涨 一、什么是接口测试 我们要想知道接口测试怎么做,首先要明白接口测试是什么?一般…

Tomcat怎么优化

目录 性能方面的优化: 安全方面的优化: 引言:面试官问到的Tomcat怎么优化,这两个方面直接得到他认可!! 性能方面的优化: 内存优化:-Xms java虚拟机初始化时的最小内存、-Xmx java虚…

C++多态深度剖析

文章目录 1. 前言2. 多态的概念及定义2.1 概念2.2 多态的构成条件2.3 虚函数2.4 虚函数的重写2.5 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比 3. 抽象类3.1 概念3.2 接口继承和实现继承 4. 多态的原理4.1 虚函数表4.2 多态的原理4.3 动…

《30天自制操作系统》 第一周(D1-D7) 笔记

前言:这是我2023年5月份做的一个小项目,最终是完成了整个OS。笔记的话,只记录了第一周。想完善,却扔在草稿箱里许久。最终决定,还是发出来存个档吧。 一、汇编语言 基础指令 MOV: move赋值,数据传送指令…

UE4 CustomDepthMobile流程小记

原生UE opaque材质中获取CustomDepth/CustomStencil会报错 在其Compile中调用的函数中没有看到报错逻辑 材质节点的逻辑都没有什么问题,所以看一下报错 在HLSLMaterialTranslator::Translate中 修改之后 mobile流程的不透明材质可以直接获取SceneTexture::customd…

Pyroch中transforms 图像增强发方法的应用

1 应用场景 在我们训练模型的时候,有的时候数据不够,就需要通过水平翻转、垂直翻转、镜像、旋转、改变亮度、标准化等方式增加图像的多样性,此时可以调用Pytorch 中的Transforms完成这些操作 2 导入相应的库 from torchvision import tran…

蓝桥杯-sort排序(上)

sort排序 🎈1.算法说明🎈2.例题🔭2.1例题一🔭2.2例题二🔭2.3例题三🔭2.4例题四🔭2.5例题五🔭2.6例题六 🎈1.算法说明 🔎对于一个数组,通过对数组中…

【html+css+js】实现图片轮播效果

简单实现 <html><head><style type"text/css">*{background-color:green;}#lunbo{ width:600px; height:600px;position:relative;left:100px;top:50px;} //定义轮播图片所显示的位置ul{width:100%; height:100%; position:relative;left:0px;top…

基于 SpringBoot+Vue 的读书笔记共享平台的研究与实现,附源码,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

K8s 安装部署-Master和Minion(Node)文档

K8s 安装部署-Master和Minion(Node)文档 操作系统版本&#xff1a;CentOS 7.4 Master &#xff1a;172.20.26.167 Minion-1&#xff1a;172.20.26.198 Minion-2&#xff1a;172.20.26.210&#xff08;后增加节点&#xff09; ETCD&#xff1a;172.20.27.218 先安装部署ETC…

如何用GPT快速写论文?

详情点击链接&#xff1a;如何用GPT快速写论文&#xff1f; 第一&#xff1a;2024年AI领域最新技术 1.OpenAI新模型-GPT-5 2.谷歌新模型-Gemini Ultra 3.Meta新模型-LLama3 4.科大讯飞-星火认知 5.百度-文心一言 6.MoonshotAI-Kimi 7.智谱AI-GLM-4 第二&#xff1a;Op…

CVE-2024-23897 Jenkins 任意文件读取漏洞

项目介绍 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。Jenkins是开源CI&CD软件领导者&#xff0c; 提供超过1000个插…

以太网的 MAC 层

目录 1. MAC 层的硬件地址 48 位的 MAC 地址 2. MAC 帧的格式 以太网 V2 的 MAC 帧格式 无效的 MAC 帧 IEEE 802.3 MAC 与以太网 V2 MAC 帧格式的区别 1. MAC 层的硬件地址 硬件地址又称为物理地址&#xff0c;或 MAC 地址。 IEEE 802 标准为局域网规定了一种 48 位…

多维数组的使用

1. 数组的概念 数组(Array)&#xff1a;是多个相同类型数据按一定顺序排列的集合&#xff0c;并使用一个名字命名&#xff0c;并通过编号的方式对这些数据进行统一管理。 数组中的概念&#xff1a; – 数组名 – 下标&#xff08;或索引&#xff09; – 元素 – 数组的长度 …

flink-java使用介绍,flink,java,DataStream API,DataSet API,ETL,设置 jobname

1、环境准备 文档&#xff1a;https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/ 仓库&#xff1a;https://github.com/apache/flink 下载&#xff1a;https://flink.apache.org/zh/downloads/ 下载指定版本&#xff1a;https://archive.apache.org/dist/flink…

【Leetcode】2861. 最大合金数

文章目录 题目思路代码结果 题目 题目链接 假设你是一家合金制造公司的老板&#xff0c;你的公司使用多种金属来制造合金。现在共有 n 种不同类型的金属可以使用&#xff0c;并且你可以使用 k 台机器来制造合金。每台机器都需要特定数量的每种金属来创建合金。 对于第 i 台…

Redis(八)哨兵机制(sentinel)

文章目录 哨兵机制案例认识异常 哨兵运行流程及选举原理主观下线(Subjectively Down)ODown客观下线(Objectively Down)选举出领导者哨兵选出新master过程 哨兵使用建议 哨兵机制 吹哨人巡查监控后台master主机是否故障&#xff0c;如果故障了根据投票数自动将某一个从库转换为新…

深入理解STM32中断处理机制

深入理解STM32中断及其使用方法&#xff08;基于HAL库&#xff09; STM32微控制器作为一款强大的嵌入式系统芯片&#xff0c;在各种应用中都需要使用中断来实现实时响应和处理各种事件。本文将深入讨论STM32中断的概念、HAL库的中断处理机制以及如何在STM32CubeMX中配置和使用…

AI编译器的后端优化策略

背景 工作领域是AI芯片工具链相关&#xff0c;很多相关知识的概念都是跟着项目成长建立起来&#xff0c;但是比较整个技术体系在脑海中都不太系统&#xff0c;比如项目参与中涉及到了很多AI编译器开发相关内容&#xff0c;东西比较零碎&#xff0c;工作中也没有太多时间去做复盘…

特征点匹配 harris

算法的核心是利用局部窗口在图像上进行移动&#xff0c;判断灰度是否发生较大的变化。如果窗口内的灰度值&#xff08;在梯度图上&#xff09;都有较大的变化&#xff0c;那么这个窗口所在区域就存在角点。 这样就可以将 Harris 角点检测算法分为以下三步&#xff1a; 当窗口…