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

抽象类、接口、枚举

一、抽象类

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;
        }
    }

相关文章:

  • rust 安全性
  • PiscTrace开发者版:只需考虑算法的视图处理应用
  • python绘制年平均海表温度、盐度、ph分布图
  • TTRSS 迁移实战
  • 通过阿里百炼配置自己的------AI 智能英语陪练
  • springboot系列十四: 注入Servlet, Filter, Listener + 内置Tomcat配置和切换 + 数据库操作
  • 程序员本地网站(WEB)
  • 政安晨【零基础玩转各类开源AI项目】DeepSeek 多模态大模型Janus-Pro-7B,本地部署!支持图像识别和图像生成
  • 数据链路层有给用户可操作的接口吗
  • Docker国内镜像源部署deepseek
  • [MDM 2024]Spatial-Temporal Large Language Model for Traffic Prediction
  • Vite 和 Webpack 的区别和选择
  • 项目自荐:一个实用的免费批量文档翻译器
  • 【爬虫基础】第一部分 网络通讯-编程 P3/3
  • 快速熟悉商城源码的架构、业务逻辑和技术框架
  • 跟着AI学vue第八章
  • 基于SpringBoot的线上汽车租赁系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • GStreamer源码安装1.24版本
  • pyside6学习专栏(三):自定义QLabel标签扩展类QLabelEx
  • 复制所绑定元素文本的vue自定义指令
  • 总导演揭秘十五运会闭幕式:赴一场星辰大海之约
  • 经济日报刊文:品牌经营不能让情怀唱“独角戏”
  • 欧盟决意与俄罗斯能源彻底决裂之际,美国谋划新生意:进口俄气对欧转售
  • 850亿元!2025年中央金融机构注资特别国债(一期)拟第一次续发行
  • “爱鸟周”为何不能像FI和花展那样“市区联动”
  • 国家税务总局泰安市税务局:山东泰山啤酒公司欠税超536万元