抽象类和接口的区别(小白版)

news2024/11/23 22:46:27

抽象类和接口的区别:

抽象类(Abstract Class):
  1. 抽象类是一种不能被实例化的类,它只能被用作其他类的父类(基类)。
  2. 抽象类可以包含抽象方法和非抽象方法。抽象方法是没有具体实现的方法,需要在子类中被具体实现。非抽象方法则是有具体实现的方法,子类可以直接继承和使用。
  3. 抽象类可以有构造方法,用于初始化实例对象,但抽象类本身不能被实例化。
  4. 抽象类可以包含成员变量,也可以包含普通的方法实现。
  5. 一个类可以继承一个抽象类,因为Java是单继承语言,一个子类只能有一个直接的父类。

抽象类的主要目的是为了提供一种抽象的模板或基础类,它能够定义一些通用的属性和行为,供子类进行继承和实现。抽象类本身不能被实例化,只能作为父类被继承。

接口(Interface):
  1. 接口是一种纯粹的抽象类型,它用于定义一组方法的规范,但接口本身不提供方法的实现。
  2. 接口只能包含抽象方法和常量的定义。抽象方法是没有具体实现的方法,需要在实现接口的类中被具体实现。常量则是接口中定义的不可变的值。
  3. 接口中的方法默认是公有的抽象方法,常量默认是公有的静态常量,不需要显式地声明为public。
  4. 一个类可以实现多个接口,这是Java支持多继承特性的一种体现。通过实现接口,一个类可以获得多个不同接口的行为。
  5. 接口不能包含成员变量,但可以定义常量。

接口的主要作用是定义一组行为规范,通过实现接口,类可以获得特定行为的能力,从而实现更高的抽象和多态。

总结一下区别:
  • 抽象类是一种部分实现的类,它可以包含具体的方法和抽象方法,主要用于定义共性的行为和属性,无法进行多继承。
  • 接口是一种完全抽象的类型,它只能包含抽象方法和常量的声明,主要用于描述对象具有的行为,可以被类多重实现。

     在设计和使用类时,需要根据具体情况来选择使用抽象类还是接口。抽象类适用于在多个子类之间有较多重复代码和共同特征的情况下使用,而接口适用于在不相关的类之间定义通用行为要求的情况下使用

案例解释:

一、抽象类(Abstract Class):

    抽象类是一种不能被实例化的类,只能被其他非抽象类继承。它主要用于定义一些通用的模板和规范,具体的实现由其子类完成。下面是抽象类的一些特点:

  1. 抽象类通过关键字abstract来定义,在类的声明前加上abstract即可。
  2. 抽象类可以包含抽象方法和非抽象方法。

下面是一个简单的示例,通过一个抽象类Animal来定义动物的一些特征和行为:

package LxDemo;

/**
 * @author 懒鱼七忆
 * @date 2024/1/2 16:29
 */

/*
*
* 1.抽象类必须用 abstract 声明
* (可以单独把Animal,单独写成一个类,为了省事,我写在一个里面)
**/
abstract class Animal {
    protected String name;
    protected int age;

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

    abstract void makeSound(); // 抽象方法

    public void printInfo() {   // 非抽象方法
        System.out.println("姓名: " + name);
        System.out.println("年龄: " + age);
    }
}

/*2.抽象类需要继承来实现,继承的关键字是extends。*/
class Dog extends Animal {
    public Dog(String name, int age) {
        super(name, age);
    }


    //抽象类必须实现抽象方法,方法名自己定义
    void makeSound() {    // 实现抽象方法
        System.out.println("汪汪汪!");
    }
}

class Cat extends Animal {
    public Cat(String name, int age) {
        super(name, age);
    }

    void makeSound() {    // 实现抽象方法
        System.out.println("喵喵喵!");
    }
}

public class abstractDemo {
    public static void main(String[] args) {
       /*
       * 1.首先,我们定义了一个变量dog,其类型是Animal,这意味着它是一个指向Animal类对象的引用。
       * 2.然后,通过调用Dog类的构造函数Dog("旺财", 3)创建一个Dog类的实例对象。
       * 3.由于Dog类是Animal类的子类,所以可以将Dog对象赋值给Animal类型的变量dog。
       * 4.这样,我们就可以通过dog引用访问Animal类中定义的方法和属性。
       * 
       *   需要注意的是,虽然dog引用的是一个Dog类实例对象,但编译器只知道它是
       * 一个Animal类型的引用,因此只能调用Animal类中定义的方法和属性。如果
       * Dog类重写了Animal类中的某些方法,那么实际执行时将调用Dog类中的方法。
       *
       *    总结:通过将子类对象赋值给父类类型的变量,我们可以实现多态性,并且
       * 可以在代码中更灵活地处理对象。这使得我们能够统一对待不同的子类对象,并
       *使用相同的方法来处理它们,从而提高代码的可扩展性和可维护性。
       */
        Animal dog = new Dog("旺财", 3);
        dog.makeSound();    // 输出:"汪汪汪!"
        dog.printInfo();    // 输出:"Name: 旺财","Age: 3"

        //实例化cat对象
        Animal cat = new Cat("小花", 2);
        cat.makeSound();    // 输出:"喵喵喵!"
        cat.printInfo();    // 输出:"Name: 小花","Age: 2"
    }
}
运行结果:

二、接口(Interface):

   接口是一种纯粹的抽象概念,它定义了一些方法的签名(即方法名称、参数列表和返回类型),而不包含具体的实现。接口用于描述对象具有的行为能力,而不关心具体类的实现细节。下面是接口的一些特点:

  1. 接口通过关键字interface来定义,类似于类的声明。
  2. 接口中只能包含常量和抽象方法。

以下是一个简单的示例,通过接口Shape来定义形状对象的一些行为:

package LxDemo;

/**
 * @author 懒鱼七忆
 * @date 2024/1/2 16:49
 */
//利用interface定义一个接口
interface Shape {
    //计算数字和
    int addition();
    //计算数字差
    int subtraction();
}

//利用implements,实现接口
class Circle implements Shape {
    private int radius;
    int a = 10;

    public Circle(int radius) {
        this.radius = radius;
    }

    public int addition() {    // 实现接口中的方法
        return a + radius;
    }

    public int subtraction() {    // 实现接口中的方法
        return a - radius;
    }
}

//利用implements,实现接口
class Rectangle implements Shape {
    private int snum;
    private int munm;

    public Rectangle(int snum, int munm) {
        this.snum = snum;
        this.munm = munm;
    }

    public int addition() {    // 实现接口中的方法
        return snum + munm;
    }

    public int subtraction() {    // 实现接口中的方法
        return (snum - munm);
    }
}

public class inteFaceDemo {
    public static void main(String[] args) {
        Shape circle = new Circle(5);
        System.out.println("10 + 5 = " + circle.addition());
        System.out.println("10 - 5 = " + circle.subtraction());

        Shape rectangle = new Rectangle(3, 4);
        System.out.println("3 + 4 = " + rectangle.addition());
        System.out.println("3 - 4 =" + rectangle.subtraction());
}
}
运行结果:

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

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

相关文章

【JAVA】实验二 类与对象

实验名称 实验二 类与对象 实验目的 1. 深刻理解类的封装与继承; 2. 熟练掌握类的定义、包与路径、对象的创建、方法的调用、类的继承、方法的重写、运行时多态、访问权限修饰符的使用等; 3. 熟练运用JDK提供的常用类及API。 实验内容&…

测试自动创建设备节点的功能

一. 简介 上一篇文章在 新设备驱动框架代码的基础上,添加了自动创建设备节点的代码。文章地址如下: 自动创建设备节点代码的实现-CSDN博客 本文对自动创建设备节点的功能进行测试。 二. 自动创建设备节点代码的测试 1. 编译驱动,并拷贝…

Python 数据库(一):使用 mysql-connector-python 操作 MySQL 数据库

大家好,我是水滴~~ 当涉及到使用 Python 操作 MySQL 数据库时,mysql-connector-python 库是一个强大而常用的选择。该库提供了与 MySQL 数据库的交互功能,使您能够执行各种数据库操作,如连接数据库、执行查询和插入数据等。在本文…

2024年美赛数学建模ABCDEF题思路选题分析

文章目录 1 赛题思路2 美赛比赛日期和时间3 赛题类型4 美赛常见数模问题5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 美赛比赛日期和时间 比赛开始时间:北京时间2024年2月2日(周五&#xff…

[笔记] GICv3/v4 ITS 与 LPI

0. 写在前面 由于移植一个 pcie 设备驱动时,需要处理该 pcie 设备的 msi 中断(message signaled interrup)。 在 ARM 中, ARM 建议 msi 中断实现方式为: pcie 设备往 cpu 的一段特殊内存(寄存器)写某一个值&#xff0…

浅谈开关量信号隔离器在钢铁厂除鳞系统的应用-安科瑞 蒋静

摘要:在钢铁生产线中,轧制是其中一项重要的加工工艺。通过轧制将金属坯料进行延展和定型,满足不同行业的使用要求。在轧制前需要进行除鳞,除鳞系统是通过高压水形成扇形水束,喷射到钢坯表面将氧化铁层剥离。高压水由高…

精益生产敏捷实践手册:软件行业的精益转型之路——张驰咨询

精益生产培训的内容相当广泛,涵盖创立精益的理念、工具、执行策略和管理方法。下面将详细介绍各种培训内容以及它们的作用: 理念建设 精益生产基本概念:什么是精益,它的历史和核心理念等。 组织变革管理:怎样在组织…

数据库攻防学习之Redis

Redis 0x01 redis学习 在渗透测试面试或者网络安全面试中可能会常问redis未授权等一些知识,那么什么是redis?redis就是个数据库,常见端口为6379,常见漏洞为未授权访问。 0x02 环境搭建 这里可以自己搭建一个redis环境&#xf…

2024网络安全趋势—— “双刃剑”效应带来全新冲击和挑战

“生成式AI”正以前所未有的方式影响着人们的生活和工作方式。 在网络安全方面,这项技术也正深刻改变着对抗形态和攻防模式,其在打开人类认知世界新路径的同时,也成为黑客开展网络攻击的“利器”。随着生成式AI的深入发展,“双刃…

别划走!3分钟看懂 Git 底层工作原理

这是一篇能让你迅速了解 Git 工作原理的文章,实战案例解析,相信我,3 分钟,绝对能够有收获! Git 目录结构 Git 的本质是一个文件系统(很重要,记住这句话,理解这句话)&am…

oracle-undo

tips:串行化隔离级别:事务开始后,对一张表不会被别人影响,对于审计工作比较有用,避免了幻读。 undo表空间:自动生成段,自动生成区,自动维护的,不像一般的表空间&#xff…

【响应式编程-01】Lambda表达式初体验

一、简要描述 Lambda初体验Lambda表达式的语法格式Lambda表达式应用举例Lambda表达式底层实现 二、什么是Lambda表达式 Java8新特性,来源于数学中的λ[l:mdə]演算 是一套关于函数(f(x))定义、输入量、输出量的计算方案 Lambda表达式 -> 函数 使代码变得简洁…

智慧园区物联综合管理平台之架构简述

总体架构 系统总体划分为物联感知系统层、 核心平台层、 综合运营服务平台和展示层四部分。 物联感知系统层 物联感知系统主要是支撑园区智能化运行的各子系统, 包括门禁系统、 视频监控系统、 车辆管理系统等。 核心平台层 核心平台层包括: 园区物联综合管理平台和园区…

6.4 通过IO实现文件的读取与写入

6.4 通过IO实现文件的读取与写入 1. File类及常用方法2. 通过字节字符流实现文件读取与写入1. 流2. 字节输入流 InputStream 3.2. 1. File类及常用方法 package com.imooc.io;import java.io.File; import java.io.IOException;public class FileSample {public static void ma…

Premiere分屏特效图文内容幻灯片展示视频素材PR模板下载

Premiere Pro 模板,多屏幕内容展示PR幻灯片模板,分屏特效图文视频素材pr模板下载。 这是一个高质量、组织良好且易于自定义的视频剪辑模板。只需替换图像或视频,编辑文本,添加音频,微微调整即可! 来自PR模板…

Java经典框架之SpringBoot

SpringBoot Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. SpringBoot基础 2. Spring…

GraalVM Native学习及使用

概述 在开发Spring Boot 应用或者其他JAVA程序的过程中,启动慢、内存占用大是比较头疼的问题,往往需要更多的资源去部署,成本大幅提高。为了优化上述问题,常常使用优化程序、使用更小消耗的JVM、使用容器等措施。 现在有一个叫做…

权限修饰符和代码块

权限修饰符:是用来控制一个成员能够被访问的范围的。、 可以修饰成员变量、方法、构造方法、内部类。 权限修饰符的范围 权限修饰符的使用规则: 实际开发中,一般只用private和public 成员变量私有 方法公开 特例:如果方法中的…

Debezium日常分享系列之:向 Debezium 连接器发送信号

Debezium日常分享系列之:向 Debezium 连接器发送信号 一、概述二、激活源信号通道三、信令数据集合的结构四、创建信令数据集合五、激活kafka信号通道六、数据格式七、激活JMX信号通道八、自定义信令通道九、Debezium 核心模块依赖项十、部署自定义信令通道十一、信…

前端文件上传组件最全封装+删除+下载+预览

前言&#xff1a;使用的是若依的框架element uivue2封装的。如果有不对的地方欢迎指出。后台管理使用&#xff0c;文件需要上传。回显列表&#xff0c;详情也需要回显预览 // 开始封装组件&#xff1a;封装在 src/components/FileUpload/index.vue中 <template><div c…