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

接口与抽象类

目录

    • 一、抽象类
    • 二、接口
    • 三、使用场景
    • 四、示例代码

    抽象类(Abstract Class)和接口(Interface)在 Java 中都是用来实现代码的抽象化和封装,但它们之间有一些关键的区别和用途。
    

一、抽象类

  1. 定义:抽象类是使用 abstract 关键字定义的类,它可以包含抽象方法和具体方法。
  2. 构造方法:抽象类不能被实例化,但可以有构造方法,这些构造方法只能在子类中被调用。
  3. 成员变量:可以有实例变量和类变量,并且可以给实例变量赋初始值。
  4. 方法实现:可以包含已经实现的方法和没有实现的抽象方法。
  5. 继承:一个类只能继承一个抽象类。
  6. 访问修饰符:抽象方法必须被声明为 publicprotected(默认),不能是 private
  7. 多态:抽象类可以实现多态,但需要通过子类来实现。
        

二、接口

  1. 定义:接口是使用 interface 关键字定义的,完全抽象的类型。
  2. 构造方法:接口不能有构造方法。
  3. 成员变量:接口中的所有变量默认都是 public static final 的,即常量。
  4. 方法实现:在 Java 8 之前,接口中的方法默认是抽象的,不能有实现。从 Java 8 开始,接口可以包含默认方法和静态方法
  5. 继承:一个类可以实现多个接口。
  6. 访问修饰符:接口中的方法默认是 public 的,并且不能有 private 方法。
  7. 多态:接口天生就是为了实现多态。
        

三、使用场景

  • 抽象类
    • 当你有一个共同的基类,它包含一些公共的属性和方法,但同时也有一些需要子类去实现的抽象方法时,使用抽象类是合适的。
    • 当类层次结构中的一些类共享相同的属性和方法,并且这些方法有共同的实现时,抽象类可以提供这些共同的实现。
    • 当你需要提供某些默认行为时,抽象类可以提供默认方法的实现。
  • 接口
    • 当你想要为多个类提供多态行为时,接口是理想的选择。它们允许不同的类以统一的方式被处理。
    • 当你想要强制类实现某些方法时,接口可以定义这些方法,确保所有实现该接口的类都遵循相同的契约。
    • 当你想要实现回调机制时,例如事件监听器模式,接口可以用来定义回调方法

    

四、示例代码

// 抽象类示例
abstract class Animal {
    abstract void makeSound();
    void eat() {
        System.out.println("This animal eats food.");
    }
}

class Dog extends Animal {
    void makeSound() {
        System.out.println("Woof woof!");
    }
}

// 接口示例
interface Movable {
    void move();
}

interface Flyable {
    void fly();
}

class Bird implements Movable, Flyable {
    public void move() {
        System.out.println("The bird is running.");
    }

    public void fly() {
        System.out.println("The bird is flying.");
    }
}

    在这个例子中,Animal 是一个抽象类,它定义了所有动物共有的行为 eat,并且有一个抽象方法 makeSound 需要子类 Dog 去实现。而 Movable 和 Flyable 是接口,它们定义了 Bird 类必须实现的行为。


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

相关文章:

  • uniapp 整合 OpenLayers - 测距测面
  • 「QT」几何数据类 之 QPointF 浮点型点类
  • 【JavaEE进阶】Spring AOP 原理
  • macOS开发环境配置与应用开发(详细讲解)
  • pytest插件精选:提升测试效率与质量
  • 濮良贵《机械设计》第十版课后习题答案全解PDF电子版
  • Spring Boot 集成 MongoDB - 入门指南
  • 【CTF Web】BUUCTF BUU BURP COURSE 1 Writeup(X-Real-IP伪造+POST请求)
  • mysql 8.0 时间维度表生成(可运行)
  • VMware Workstation Player虚拟机Ubuntu启用Windows共享目录
  • 网络通信开课作业c++
  • k8s证书过期处理
  • Scratch植物大战僵尸【机器人vs外星人版本】
  • 【Go】Go语言中的数组基本语法与应用实战
  • RecyclerView的子项长按选择功能
  • 幼儿与非幼儿识别系统源码分享
  • 【C++】多态,要这样学
  • PFC理论基础与Matlab仿真模型学习笔记(1)--PFC电路概述
  • requests-html的具体使用方法有哪些?
  • Docker安装mysql安装nginx安装Redis
  • 蓝桥杯18小白第5题
  • labview串口大数据量报错的一种解决思路(通过tcp进行写入和读取串口数据)
  • 最小二乘估计
  • ubuntu使用wireshark抓取数据
  • 【Scala入门学习】Scala的方法和函数
  • 【Go】十五、分布式系统、Consul服务注册发现、Nacos配置中心搭建