当前位置: 代码迷 >> 综合 >> 抽象类(abstract)和接口(interface),枚举(Enum)
  详细解决方案

抽象类(abstract)和接口(interface),枚举(Enum)

热度:116   发布时间:2023-11-22 14:42:36.0

抽象类

    • abstract抽象的
      • 1.可以修饰什么
      • 2.修饰后有什么特点
      • 3.什么叫抽象类 抽象类有什么特点?(通常用来描述事物 还不是很具体)
      • 4. 小问题
    • 接口(interface)
    • 枚举(Enum)

abstract抽象的

(很不具体 没有具体的执行 只是个概念)

1.可以修饰什么

  1. 修饰方法
    用abstract修饰符修饰的方法 只有方法的结构 没有方法执行体叫做抽象方法
    当然注意native修饰的方法虽然也没有方法体 但是不是抽象方法 只是执行的过程是其他语言写的 看不见
  2. 修饰类 用abstract修饰符修饰的类 叫做抽象类

2.修饰后有什么特点

抽象类中必须有抽象方法么? 不是必须含有抽象方法
抽象方法必须放在抽象类中么? 目前来看必须放在抽象类中(或接口中) 普通类是不允许含有抽象方法

3.什么叫抽象类 抽象类有什么特点?(通常用来描述事物 还不是很具体)

  1. 类里面有什么 成员
    属性 可以含有一般的属性  也可以含有 private static final等等
    方法 可以含有一般的方法  也可以含有 private static final等等
    注意:抽象类中是允许含有抽象方法(只有方法结构 没有方法执行体)
    块  可以含有一般的程序块 也可以含有static程序块
    构造方法 可以含有构造方法  包括重载

  2. 类如何使用 创建对象
    抽象类含有构造方法 但是我们不能通过调用构造方法直接创建对象
    抽象类只能通过子类单继承来做事
    为什么不让我们调用构造方法创建对象?为什么还有呢?

  3. 类和类的关系
    抽象类----直接单继承----抽象类 可以
    抽象类----直接单继承----具体类 可以 (用法通常不会出现)
    具体类----直接单继承----抽象类 不可以 (将父类的抽象方法具体化  或子类也变成抽象类)

4. 小问题

抽象类中能不能没有抽象方法 全部都是具体成员 可以
抽象类中能不能没有具体成员 全部都是抽象方法 可以 —> 抽象类抽象到极致 质的变化 —> 接口
接口可以理解为是抽象类抽象到极致—>还是一个类的结构 不能用class修饰 改用interface修饰

接口(interface)

什么是接口(通常是为了定义规则)
接口也是一个类的结构 只不过 用interface修饰 替换原有的class

  1. 有什么 成员
       属性 不能含有一般属性 只能含有公有的静态的常量 public static final
       方法 不能含有一般方法  只能含有公有的抽象的方法(1.8 defualt修饰具体方法)
       块 不能含有一般程序块 也不能含有static块(块本身就是具体的 接口中不让有具体的)
       构造方法 不能含有构造方法

  2. 如何使用 创建对象
    不能创建对象
    只能通过子类多实现(implements)来做事
    public class A implements B,C,D{

    }

  3. 与别的类结构关系
    接口不能继承别的类 最抽象
    抽象类----直接多实现----接口 可以
    具体类----直接多实现----接口 不可以(必须将接口中的抽象方法具体化 自己变成抽象类)
    *接口—多继承—接口 可以直接多实现
    在这里插入图片描述

枚举(Enum)

一个类中的对象 认为个数是有限且固定的 可以将每一个对象一一列举出来

  1. 试一试若没有枚举类型的时候 如何手动设计 (静态常量 单例模式) Day(类 当做描述星期 7个对象)
    private构造方法
    public static final属性 = new

  2. JDK1.5版本之后可以直接定义enum类型
     我们自己定义的enum类型直接默认继承Enum(java.lang包)
     我们自己定义的enum类型不能再写extends 但是可以实现
     Enum类型
       有两个属性
         name----->枚举对象的名字  name()获取name属性
         ordinal—>枚举对象在类中罗列的顺序 类似index 也从0开始 ordinal()获取序号
       一些常用的方法
         valueOf()   通过给定的name获取对应的枚举对象
         values()    获取全部的枚举对象 —> 返回一个数组 Day[]
         compareTo()  可以比较两个枚举对象 int
         toString()   由于这个方法没有final修饰 可以覆盖(重写)

  3. switch内部判断枚举的应用

  4. 我们也可以在enum中描述自己的一些属性或方法
    必须在enum类中第一行 描述一下枚举的样子 最后需要分号结束;
    可以定义自己的属性
    类创建的过程中 帮我们创建枚举类型的对象
    需要给枚举类型提供对应样子的构造方法 构造方法只能private修饰 可以重载

  相关解决方案