抽象类、接口、枚举

news/2025/2/24 3:36:40

一、抽象类

1.1 简介

作为父类,里面的方法逻辑不能满足任何一个子类的需求,提供的逻辑根本就用不上,那么就不添加方法体了,此时这个方法需要 使用关键字abstract来修饰,表示为抽象方法,而抽象方法所在的类也必须使用抽象abstract来修饰,这个类就是抽象类。

1.2 抽象类的特点

1)由abstract修饰的方法为抽象方法,抽象方没有方法体,需要使用分号结尾

2)若类中包含抽象方法,那么该类必须使用关键字abstract声明成抽象类,final不能修饰抽象类

3)抽象类里,可以没有抽象方法

4)抽象类里可以提供构造器,但是不能实例化,没有意义。

5)一个类继承了抽象类,那么必须重写里面的所有抽象方法,除非该子类也声明为抽象类。

public abstract class Student extends Person {//抽象类
public static void main(String[] args) {
    Student s = new Student("小花", 18, 100) ;//抽象类不能实例化对象
    s.setAge(20);
    s.setName("小红");
    System.out.println(s.getAge());
    System.out.println(s.getName());
}

1.3 抽象类的意义

1) 为其子类提供一个公共的父类型

2) 封装子类中重复的内容,如成员变量和方法

3) 定义抽象方法,子类虽然有不同的实现逻辑,但该方法的定义却是一致的。

//一个抽象的Person类
public abstract class Person {
    private String name;//私有的成员变量name
    private int age;//私有的成员变量age

    public abstract void sleep();//一个抽象方法

    Person(){}
    Person(String name,int age){//实参构造器,用来初始化
        this.name=name;
        this.age=age;
    }
    public void setName(String name){//公有的set方法
        this.name=name;
    }
    public String getName(){//公有的get方法
        return name;
    }
    public void setAge(int age){
        this.age=age;
    }
    public int getAge(){
        return age;
    }
}
//Student类继承了抽象的Person类
public  class Student extends Person {
    private int score;//自己私有的成员变量score

    Student() {}

    Student(String name, int age, int score) {//在构造器中初始化
        super(name, age);
        this.score = score;
    }
 @Override//重写了抽象父类中的方法
    public void sleep() {
        System.out.println("学生睡觉");
    }

    public static void main(String[] args) {
        Student s = new Student("小花", 18, 100) ;//创建了一个对象s,初始化name为小花,age为18,score为100
        s.setAge(20);//调用了set方法,给age重新赋值
        s.setName("小红");//调用了set方法,给name重新赋值
        s.sleep();
        System.out.println(s.getAge());
        System.out.println(s.getName());
    }
}

二、接口

有的时候,我们需要从几个不相关的类中派生出一个子类,继承他们的所有成员变量和方法,但是java不支持多继承。此时,我们可以使用接口,来达到多继承的效果

2.1 接口特点

  • 使用interface进行定义

  • 可以提供成员变量,默认提供public static final进行修饰

  • 可以提供成员方法,默认使用public abtract进行修饰

  • 接口中不能存在构造器,接口不能实例化,没有任何意义

2.2 实现接口

1) 与继承不同,一个类可以实现多个接口。接口间使用逗号分开。

2) 使用关键字implements进行实现,必须实现接口中的所有抽象方法

3) 若一个类中没有全部实现接口中的抽象方法,那么该类需要使用abstract声明成抽象类

2.3 接口之间的继承

1)接口之间可以存在继承关系,即一个接口通过关键字extends可以继承另一个接口。

2)子接口继承了父接口中的所有抽象方法

练习:

1. USB接口: 充电功能  charge(); 获取信息  getInfo()
2. Computer类型:     属性:两个USB接口:   usb1,usb2 ;     方法:两个属性的set方法
3. KeyBoard键盘类:  实现USB接口
4. Mouse鼠标类:  实现USB接口
5. Program测试类:

interface USB {
    void charge();
    String getInfo();
}

public class Computer {
    private USB usb1;
    private USB usb2;

    public void setUsb1(USB usb1) {
        this.usb1 = usb1;
    }

    public void setUsb2(USB usb2) {
       this.usb2 = usb2;
    }

    public String getUsb1() {
        return usb1.getInfo();
    }

    public String getUsb2() {
        return usb2.getInfo();
    }
}

    class Keyboard implements USB{
        @Override
        public void charge(){
            System.out.println("键盘输入");
        }
        @Override
        public String getInfo(){
            return "键盘";
        }
    }

    class Mouse implements USB{
        @Override
        public void charge(){
            System.out.println("鼠标点击");
        }
        @Override
        public String getInfo(){
            return "鼠标";
        }
    }
    class Program{
        public static void main(String[] args) {
            Computer computer = new Computer();
            Keyboard keyboard = new Keyboard();
            Mouse mouse = new Mouse();
            computer.setUsb1(keyboard);
            computer.setUsb2(mouse);
            System.out.println(computer.getUsb1());
            System.out.println(computer.getUsb2());
            keyboard.charge();
            mouse.charge();
        }
    }

三、枚举

3.1 简介

在Java中,枚举是一种特殊的引用数据类型,是一个被命名的整型常数的集合,用于声明一组带标识符的常数,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。

主要用途是:将一组常量,也可以说成是一组离散值组织起来。

3.2 定义 

1. 如果不想做其他描述, 直接添加枚举的对象,即属性,也就是散列值。

2. 如果想要添加一些描述,提供私有构造器,构造器的形参根据需求而定

    注意:一旦添加了形参,那么在提供对象时,必须在对象后添加(有参传参)来表示调用构造器

3. 调用枚举时,格式:    枚举类的名字.值。

4. 如果想要显示描述信息,可以提供描述属性的get方法 或者重写toString方法

public enum  Week {
    周一, 周二, 周三, 周四, 周五, 周六, 周日;

    public static void main(String[] args) {
        //获取季节这个枚举中的一个值
        Season a = Season.AUTUMN;
        System.out.println(a);
    }
}
    enum Season{
        SPRING("春天"),SUMMER("夏天"),AUTUMN("秋天"),WINTER("冬天");
        private String describe;
        private Season(String describe){
            this.describe =describe;
        }
    }


http://www.niftyadmin.cn/n/5863952.html

相关文章

Deepseek reasoning-content 透出调研

Deepseek reasoning-content 透出调研 部署方式:Docker Ollama Deepseek-R1:8b 参考: https://help.apiyi.com/deepseek-reasoning-content-guide.htmlhttps://yuluo-yx.github.io/blog/%E4%BD%BF%E7%94%A8-Ollama-%E9%83%A8%E7%BD%B2-DeepSeek-%E5…

【消息队列】认识项目

1. 项目介绍 该项目是去实现一个简单的消息队列,包含服务器,客户端的实现,客户端通过远程方法调用与服务器进行交互。采用自定义应用层协议,下层使用 TCP 协议进行数据在网络中传输,核心功能提供了虚拟主机&#xff0…

[数据结构]栈详解

目录 一、栈的概念及其结构 二、栈的实现 1.栈的初始化 void STInit(ST* ps); 2.栈的插入 void STPush(ST* ps, STDataType x); 3.栈的删除 void STPop(ST* ps); 4.栈的大小计算 int STSize(ST* ps); 5.判断栈是否为空 bool STEmpty(ST* ps); 6.栈的销毁 void STDestro…

ncrfp:一种基于深度学习的端到端非编码RNA家族预测新方法

摘要 本文提出了一种新颖的端到端方法" ncRFP "来完成基于深度学习的预测任务。ncRFP不是预测二级结构,而是通过从ncRNAs序列中自动提取特征来预测ncRNAs家族。与其他方法相比,ncRFP不仅简化了过程,而且提高了精度。 ncRFP的主要…

Nginx学习笔记:常用命令端口占用报错解决Nginx核心配置文件解读

Nginx 1. 基础命令1.1 重新加载systemd配置1.2 停止Nginx服务1.3 启动Nginx服务1.4 重启Nginx服务1.5 查看Nginx服务状态1.6 测试配置和重载Nginx 2. 额外命令2.1 启用开机自启2.2 禁用开机自启2.3 强制关闭所有Nginx进程 3. Nginx端口占用解决方案3.1 查找占用端口8090的进程3…

运维基线方案说明

1. 总体思路 建立运维基线的核心目标是保障系统稳定性、提升安全性、及时响应异常事件并不断优化系统性能。初创公司资源有限,方案应尽可能简单、易用,同时具备一定的自动化和标准化能力。建议从以下几个层面入手: 标准化文档:制…

光明谷推出AT指令版本的蓝牙音箱SOC 开启便捷智能音频开发新体验

前言 在蓝牙音箱市场竞争日益激烈的当下,开发一款性能卓越且易于上手的蓝牙音箱,成为众多厂商追求的目标。而光明谷科技有限公司推出的 AT 指令版本的蓝牙音箱 SOC,无疑为行业带来了全新的解决方案,以其诸多独特卖点,迅…

基于Matlab实现串口实时显示波形GUI界面(源码)

在MATLAB中,GUI(图形用户界面)是一种强大的工具,用于创建交互式应用程序。本项目利用MATLAB的GUI功能,构建了一个用户界面,能够实时接收通过串口发送的监测波形数据,并在界面上动态展示这些波形…