当前位置: 首页 > article >正文

Java学习------抽象类和接口

1. 抽象类

1.1 概念

在Java开发的时候,如果类中的方法无法实现或者没有意义,此时就需要将该方法定义为抽象方法,与此同时,该类也就要定义为抽象类。这样只需要在当前类中提供一个公共代码即可,至于这个方法的具体实现,就交由子类去实现。比如现在有一个动物类Animal,该类中有一个eat()的方法,显然对于不同种类的动物来说,吃这个行为肯定是不一样的,最简单的种类来说,就是食草动物和食肉动物。这个时候,没有办法在类中的方法里去实现,因此只能将eat()的实现交由具体的子类。

1.2 语法

//抽象类
abstract class 类名{
	//抽象方法
	abstract 方法返回值类型 方法名(形参); 
}

/**例子:动物类中的eat()方法对于不同种类的动物来说,有着不同的实现,所以需要将eat()定义为抽象方法,
*  与此同时,Animal也要加上、abstract进行修饰,变为抽象类。
*/
abstract class Animal {
    abstract void eat();
}

//狗在继承了Animal这个抽象类之后,就必须要对里面的eat()方法进行实现
class Dog extends Animal {
    @Override
    void eat() {
        System.out.println("狗吃骨头");
    }
}

//同样的,猫在继承了Animal这个抽象类之后,也必须要对里面的eat()方法进行实现
class Cat extends Animal {
    @Override
    void eat() {
        System.out.println("猫吃鱼");
    }
}

1.3 注意点

  • 抽象类有构造方法,但是无法实例化,抽象类中的构造方法是给子类使用的
  • 抽象类中不一定非要有抽象方法,但是如果有了抽象方法,那么这个类就一定为抽象类
  • 一个非抽象的类继承了抽象类,就必须要对抽象方法进行重写,如果不重写,就会编译报错,除非给这个类再加上abstract,将这个类也变为抽象类,但是一般不这么做
  • abstract关键词不可以与private、final、static这些关键字一起使用,本质原因都是因为abstract修饰的方法要重写,如果加上了后面的这些关键字,就无法在子类中得到重写

2. 接口

2.1 概念

在Java中,接口表示一种规范,它定义了一组抽象方法和常量,来描述如果一个类要实现这个接口,需要具有哪些行为和属性。为什么要使用接口呢?在软件开发时,我们要符合软件开发的OCP原则,对扩展开放,对修改关闭,要在不修改原代码的情况下,添加新的代码来实现功能的扩展。因此我们需要使用接口来降低程序的耦合度,提高程序的扩展力。
例如我们的电脑,如果是一个整体,那么当我们要更换里面的一些部件时,就需要将电脑拆开,然后进行更换,这样做不仅麻烦,而且万一出现操作失误,整个电脑也就报废了。所以电脑在设计时,就给了我们很多的USB接口,当我们想更换鼠标或者键盘这些外设时,只需要拔下来,然后将新的鼠标键盘插到USB接口即可。这样不仅不用承担弄坏电脑的风险,而且还能快速地进行更换。

2.2 语法

//接口语法
[修饰符列表] interface 接口名{}

//就以上面举的Usb接口为例,这里创建一个Usb的接口
public interface Usb {
    void open();
    void close();
}

//然后在定义一个鼠标类实现这个接口,实现的同时,也必须实现Usb接口中的方法
class Mouse implements Usb {

    @Override
    public void open() {
        System.out.println("鼠标连接");
    }

    @Override
    public void close() {
        System.out.println("鼠标断开");
    }
}

//然后在定义一个键盘类实现这个接口,实现的同时,也必须实现Usb接口中的方法
class Keyboard implements Usb {

    @Override
    public void open() {
        System.out.println("键盘连接");
    }

    @Override
    public void close() {
        System.out.println("键盘断开");
    }
}

2.3 注意点

  • 接口是完全抽象的。接口没有构造方法,也无法实例化。
  • 接口中只能定义:常量+抽象方法。接口中的常量的static final可以省略。
  • 接口和接口之间可以多继承。
  • 类和接口的关系叫做实现,使用implements关键字进行接口的实现。
  • 一个非抽象的类实现接口必须将接口中所有的抽象方法全部实现。
  • 一个类可以实现多个接口。
  • Java8之后,接口中允许出现默认方法和静态方法。
  • JDK9之后允许接口中定义私有的实例方法(为默认方法服务的)和私有的静态方法(为静态方法服务的)。
  • 所有的接口隐式的继承Object。因此接口也可以调用Object类的相关方法。

3. 抽象类和接口的区别和联系

3.1 联系

  1. 两者都不能被实例化
  2. 两者都含有抽象方法

3.2 区别

  1. 设计目的:抽象类主要强调代码的复用,接口主要强调对类的行为进行约束
  2. 实现方式:一个类只能继承一个抽象类,一个类可以实现多个接口,并且一个接口还可以继承多个接口
  3. 访问修饰符:抽象类被abstract修饰,所以不能再被private、static、synchronized修饰,接口中的成员变量默认被public static final修饰,必须赋初始值且不能修改,接口中的方法可以被default、static、private修饰。
  4. 变量:抽象类中可以包含实例变量和静态变量,接口只能包含静态常量。

http://www.kler.cn/a/590714.html

相关文章:

  • 图解AUTOSAR_CP_WatchdogDriver
  • 什么是梯度方差和缩放因子
  • Effective C++ 剖析(条款1~9)
  • 前端面试:axios 是否可以取消请求?
  • jmeter分布式原理及实例
  • 流量分析实践
  • Elixir语言的开源贡献
  • 【NLP】2. TF-IDF(Log 形式)
  • 评估大语言模型挑战和方法-AAAI2025
  • 《大语言模型》学习笔记(二)
  • 【网页】CSS原子化+变量尝试
  • Redis 服务器:核心功能与优化实践
  • 基于Spring Boot的红色革命文物征集管理系统的设计与实现(LW+源码+讲解)
  • DHCP中继实验
  • prototype和proto的区别
  • 本地部署DeepSeek-R1(Dify升级最新版本、新增插件功能、过滤推理思考过程)
  • Java中接口隔离原则简介和代码举例
  • 论文速递| ECG去噪新方法:小波+ CNN提升可穿戴精度
  • CMAKE学习系列(002)--- 如何添加宏定义
  • vulnhub靶场之loly靶机