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

抽象类、接口、枚举

一、抽象类

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.kler.cn/a/558361.html

相关文章:

  • kafka+spring cloud stream 发送接收消息
  • edge浏览器将书签栏顶部显示
  • 八大排序算法(1)插入排序-直接插入排序 和 希尔排序
  • 探索火山引擎 DeepSeek-R1 满血版:流畅、高效的 AI 开发体验
  • 当 OpenAI 不再 open,DeepSeek 如何掀起 AI 开源革命?
  • Java-如何将其他地方拉取的jar包导入本地maven环境
  • eBPF加速的边缘计算网络:构建5G时代的微秒级传输引擎
  • 【算法】初等数论
  • REACT--组件通信
  • yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
  • 自动化合约生成与管理:AI与Python的完美结合
  • SpringBoot Web入门程序
  • vector结构刨析与模拟实现
  • uniapp+uview模仿企业微信请假时间选择器
  • 千峰React:组件使用(1)
  • 学习经验分享【39】YOLOv12——2025 年 2 月 19 日发布的以注意力为核心的实时目标检测器
  • 多人协同创作gitea
  • King3399(ubuntu文件系统)串口功能测试
  • 通过Selenium实现UI自动化校验输入的数据是否完整有效方式
  • 用C++实现一个简单的算法:快速排序(QuickSort)