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

JAVA八股与代码实践----接口与抽象类的区别和用法

接口和抽象类的区别

关键字abstractinterface
实例化不能直接实例化不能直接实例化
方法可以有抽象和具体方法只能有抽象方法(Java 8+ 支持默认方法)
变量可以有普通变量只能有常量 (public static final)
继承单继承多继承
构造函数可以定义不允许定义
使用场景表示实体的共有特征定义行为的规范

抽象类:定义共同的特征(Cat和Dog都具有Animal的行为,所以可以定义一个Animal抽象类,包含动物的共同行为),比如以下代码

// 抽象类 Animal
abstract class Animal {
    String name;

    Animal(String name) { // 构造函数
        this.name = name;
    }

    // 抽象方法:子类必须实现
    abstract void makeSound();

    // 具体方法:所有子类共享
    void sleep() {
        System.out.println(name + " is sleeping.");
    }
}

// 子类:狗
class Dog extends Animal {
    Dog(String name) {
        super(name);
    }

    @Override
    void makeSound() {
        System.out.println(name + " says: Woof!");
    }
}

// 子类:猫
class Cat extends Animal {
    Cat(String name) {
        super(name);
    }

    @Override
    void makeSound() {
        System.out.println(name + " says: Meow!");
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("Buddy");
        Cat cat = new Cat("Whiskers");

        dog.makeSound();
        dog.sleep();

        cat.makeSound();
        cat.sleep();
    }
}

接口:定义某种行为规范,动物的某个行为作为一个接口,在实际业务中,某个功能服务会作为一个接口,代码示例:

// 接口:定义跑步行为
interface CanRun {
    void run();
}

// 接口:定义发出声音的行为
interface CanMakeSound {
    void makeSound();
}

// 狗类:实现跑步和发声行为
class Dog implements CanRun, CanMakeSound {
    String name;

    Dog(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(name + " is running!");
    }

    @Override
    public void makeSound() {
        System.out.println(name + " says: Woof!");
    }
}

// 猫类:实现跑步和发声行为
class Cat implements CanRun, CanMakeSound {
    String name;

    Cat(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(name + " is running!");
    }

    @Override
    public void makeSound() {
        System.out.println(name + " says: Meow!");
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("Buddy");
        Cat cat = new Cat("Whiskers");

        dog.run();
        dog.makeSound();

        cat.run();
        cat.makeSound();
    }
}


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

相关文章:

  • 网络安全的学习方向和路线是怎么样的?
  • greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
  • Vue3 -- mock数据完整配置并调试【项目集成6】
  • sed使用扩展正则表达式时, -i 要写在 -r 或 -E 的后面
  • 初始ArkUI
  • Ubuntu20.04从零安装IsaacSim/IsaacLab
  • 利用KDJ指标显示多空K线(附带源码)
  • Unity3D 客户端网络角色的操作与行为分离设计详解
  • 一文详解kafka知识点
  • LayaAir引擎荣获开源大赛一等奖
  • Linux下pwm开发与框架源码分析
  • javaScript之箭头函数
  • 阿里推理模型来了!Marco-o1 发布即开源
  • 飞凌嵌入式T113-i开发板RISC-V核的实时应用方案
  • 记录一个奇怪的前端布局现象
  • 后台通用tag面包屑
  • Figma入门-文字、样式、链接、动作
  • 多联机空调节能集中控制系统
  • 机器学习——数据标注
  • 微搭低代码入门09对象
  • 基于 MONAI 的 3D 图像分割任务2(Brain Tumour 和 SwinUNETR 训练)
  • 低速接口项目之串口Uart开发(七)——如何在FPGA项目中实现自适应波特率串口功能
  • leetcode-24-两两交换链表中的节点
  • 表的增删改查(MySQL)
  • [论文阅读]Can GNN be Good Adapter for LLMs?
  • 如何在Word文件中设置水印以及如何禁止修改水印