首页 > 其他分享 >面向对象高级 枚举

面向对象高级 枚举

时间:2024-11-17 18:18:43浏览次数:3  
标签:String Season 高级 SEASONNAME 面向对象 枚举 SEASONTRAIT public

面向对象高级 枚举

1.枚举的概述

  • 枚举类型本质上也是一种,只不过是这个类的对象是有限的固定的几个,不能让用户随意创建。--->因此,枚举类的构造器通常需要封装,加上权限修饰符private;
  • 若枚举只有一个对象, 则可以作为一种单例模式的实现方式
  • 枚举类的实现:
    • 在JDK5.0 之前,需要程序员自定义枚举类型。
    • 在JDK5.0 之后,Java支持enum关键字来快速定义枚举类型

  1. 自定义枚举类
  • 私有化类的构造器,保证不能在类的外部创建其对象
  • 在类的内部创建枚举类的实例。声明为:public static final ,对外暴露这些常量对象
  • 对象如果有实例变量,应该声明为private final(建议,不是必须),并在构造器中初始化

自定义枚举典例:

public class SeasonTest {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.SPRING.getSEASONNAME());
    }
}


    class Season {
        private final String SEASONNAME;
        private final String SEASONTRAIT;

        private Season(String SEASONNAME, String SEASONTRAIT) {
            this.SEASONNAME = SEASONNAME;
            this.SEASONTRAIT = SEASONTRAIT;
        }

        public String getSEASONNAME() {
            return SEASONNAME;
        }

        public String getSEASONTRAIT() {
            return SEASONTRAIT;
        }

        public static final Season SPRING = new Season("SPRING","gentle");
        public static final Season SUMMER = new Season("SUMMER", "hot");
        public static final Season AUTUMN = new Season("AUTUMN", "cool");
        public static final Season WINTER = new Season("WINTER", "cold");

        @Override
        public String toString() {
            return "Season{" +
                    "SEASONNAME='" + SEASONNAME + '\'' +
                    ", SEASONTRAIT='" + SEASONTRAIT + '\'' +
                    '}';
        }
    }

  1. Enum关键字枚举类写法:

(1)enum类中应当将声明的实例写在开头,删去重复的 public  static  final前置修饰,通常写作:

实例名 (构造器形参1,构造器形参2,),

实例名 (构造器形参1,构造器形参2);

(2)声明枚举类中封装的属性,前置修饰通常为 private  final,通常写作:

private final 数据类型 属性名;

(3)因为属性已经封装,且为final类型,只在构造器中完成赋值,不可重写、不能改变,因此只需要提供get方法。

此处可使用快捷键AIt + Insert实现get方法的快速获取。(idea中)

(4)必写:封装构造器。通常写作:

private  enum类名(属性1,属性2,属性3){

this.属性1 = 属性1;

this.属性2 = 属性2;

this.属性3 = 属性3;

}

此处操作也可通过快捷键AIt + Insert实现,但应当注意自行将默认public权限符修改为private权限符。

(5)(非必写)重写toString方法。

重写toString方法是为了在main方法中输出enum实例时,以需要的格式输出。与另外引入getInfo接口相类似。

同样的,此处仍可以利用快捷键AIt + Insert完成根据自身的需求进行重写。

public class SeasonTest1 {

public static void main(String[] args) {
    System.out.println(Season.SPRING);
    System.out.println(Season.SPRING.getSEASONNAME());
}
}

enum Season1{
//必须在枚举类的开头生声明多个对象,多个对象之间用逗号隔开、
    SPRING ("SPRING","gentle"),
    SUMMER ("SUMMER", "hot"),
    AUTUMN ("AUTUMN", "cool"),
    WINTER ("WINTER", "cold");

    private final String SEASONNAME;
    private final String SEASONTRAIT;

    private Season1(String SEASONNAME, String SEASONTRAIT) {
        this.SEASONNAME = SEASONNAME;
        this.SEASONTRAIT = SEASONTRAIT;
    }

    public String getSEASONNAME() {
        return SEASONNAME;
    }

    public String getSEASONTRAIT() {
        return SEASONTRAIT;
    }


    @Override
    public String toString() {
        return "Season{" +
                "SEASONNAME='" + SEASONNAME + '\'' +
                ", SEASONTRAIT='" + SEASONTRAIT + '\'' +
                '}';
    }
}

enum方式定义的要求和特点
  • 枚举类的常量对象列表必须在枚举类的首行,因为是常量,所以建议大写。
  • 列出的实例系统会自动添加 public static final 修饰。
  • 如果常量对象列表后面没有其他代码,那么“;”可以省略,否则不可以省略“;”。
  • 编译器给枚举类默认提供的是private的无参构造,如果枚举类需要的是无参构造,就不需要声明,写常量对象列表时也不用加参数
  • 如果枚举类需要的是有参构造,需要手动定义,有参构造的private可以省略,调用有参构造的方法就是在常量对象名后面加(实参列表)就可以。
  • 枚举类默认继承的是java.lang.Enum类,因此不能再继承其他的类型
  • JDK5.0 之后switch,提供支持枚举类型,case后面可以写枚举常量名,无需添加枚举类作为限定。

4.枚举类的五种常用方法

(1)String toString(): 默认返回的是常量名(对象名),可以根据需求手动重写该方法。

例:

@Override
public String toString() {
    return "Season{" +
            "SEASONNAME='" + SEASONNAME + '\'' +
            ", SEASONTRAIT='" + SEASONTRAIT + '\'' +
            '}';
}


    
2static 枚举类型[] values():返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值,是一个静态方法

Season1[] values = Season1.values();
for(int i=0;i<values.length;i++){
    System.out.println(values[i]);
}

执行结果是将所有的常量对象全部打印。
    
3static 枚举类型 valueOf(String name):可以把根据输入的字符串查找对应的枚举类对象。要求字符串必须是枚举类常量对象名相同。如不是,会有运行时异常:IllegalArgumentException。

//if the target objName doesn't exist,will show error
String objName = "WINTER";
Season1 season1 =Season1.valueOf(objName);
System.out.println(season1);

运行结果为枚举类中WINTER对象的具体信息。
    
4String name():得到当前枚举常量的名称。与默认没有重写额的toString方法相同,打印结果相同。

System.out.println(Season1.WINTER.name());

运行结果为WINTER常量名。
    
5int ordinal():返回当前枚举常量的次序号,默认从0开始类似于数组下标index)

// return the index
System.out.println(Season1.AUTUMN.ordinal());

5、实现枚举类的接口

  • 和普通 Java 类一样,枚举类可以实现一个或多个接口
  • 若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。

例:

interface Info{
    void show();
}

enum Season1 implements Info {

...//具体内容省略,与前文典例相同

@Override
public void show() {
    System.out.println("It's now " + SEASONNAME);
}

}

  • 若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,则可以让每个枚举对象实例分别来实现接口的抽象方法

例:

interface Info1{
    void show();
}

enum Season2 implements Info1 {
    //必须在枚举类的开头生声明多个对象,多个对象之间用逗号隔开、

//每个对象依次重写
    SPRING("SPRING", "gentle"){
        public void show(){
        System.out.println("Spring comes.");
        }
    },

    SUMMER("SUMMER", "hot"){
        public void show(){
            System.out.println("Summer comes.");
        }
    },

    AUTUMN("AUTUMN", "cool"){
        public void show(){
            System.out.println("Autumn comes.");
        }
        },

    WINTER("WINTER", "cold"){
        public void show(){
            System.out.println("Winter comes.");
        }
    };

}每个方法依次重写接口Info中的抽象方法。

enum类实现多个接口的一般写法;

enum A implements 接口1,接口2{
    常量名1(参数){
        //抽象方法的实现或重写
    },
    常量名2(参数){
        //抽象方法的实现或重写
    },
    //...
}

标签:String,Season,高级,SEASONNAME,面向对象,枚举,SEASONTRAIT,public
From: https://blog.csdn.net/2401_88237139/article/details/143833910

相关文章

  • 10.C++面向对象7(友元,匿名对象)
    ⭐本篇重点:友元,内部类,匿名对象⭐本篇代码:c++学习/03.c++类与对象-下篇·橘子真甜/c++-learning-of-yzc-码云-开源中国(gitee.com)目录一.友元1.1友元函数 1.2友元类 二.匿名对象 一.友元友元分为友元函数和友元类,它可以帮助我们突破封装的限制。在......
  • 14天Java基础学习——第6天:面向对象编程(类与对象)
    第6天:面向对象编程(类与对象)目标本节的目标是深入理解面向对象编程中的类与对象概念,包括类的定义、对象的创建、构造方法、封装、访问修饰符、this关键字,以及静态与实例成员。通过理论与实践相结合的方式,帮助学生全面把握这些基础概念。1.类与对象的基础1.1类的定义在Ja......
  • 第五话:高级图形操作与优化
    SDL简单教程第五话:高级图形操作与优化SDL简单教程前言第五话:高级图形操作与优化5.1透明效果与颜色混合理解透明效果和颜色混合的概念SDL_SetTextureBlendMode函数详细解析SDL_SetTextureAlphaMod函数深入讲解示例:创建半透明纹理并实现混合效果5.2双缓冲和帧率控制......
  • 关于掌握Java 集合框架的那些事——从基础到高级的全面指南
    文章目录日期类型使用1.[Date类](https://so.csdn.net/so/search?q=Date类&spm=1001.2101.3001.7020)常用方法2.LocalDate类创建LocalDate对象:常用方法获取年月日:SimpleDateFormat日期格式化常用方法格式化日期解析日期Java中的集合常用方法add(Ee):将指......
  • 面向对象第二节---不带参数的方法
    一.不带参数方法1.方法的概念所谓方法其实就是指对象的行为方法是类的重要组成部分描述该对象的方法2.方法的定义public返回值类型方法名(){//步骤一:定义方法名以及返回值//这里编写方法的主体//步骤二:编写方法体}方法的返回值如果方法中有返回值,方法中必......
  • java学习笔记-面向对象-类的内部构造与对象(2)
    类是一组具有相同属性和行为的对象的抽象。类及类的关系构成了对象模型的主要内容。面向对象编程的主要任务就是定义对象模型中的各个类。1.定义类(class)//定义静态属性--班费//在类中被定义为静态的属性将被所有该类创建的对象所共享staticdoubleclass......
  • 南开高级语言程序设计2-1
    南开高级语言程序设计2-1的oj题目答案,本人亲测AC,供大家参考。2-2的见主页字符串旋转题目描述定义字符串的旋转操作为:左旋转L:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位得到字符串cdefab。右旋转R:把字符串后面的若干个字符移动到字符串的头......
  • Python 实验五 面向对象程序设计
    实验五面向对象程序设计一、实验学时:2学时二、实验目的掌握:Python类的定义,class关键字,创建对象的方法,访问对象中的成员。掌握:私有成员与公有成员,数据成员与成员方法,类方法与静态方法,属性的定义与使用,混入机制。掌握:继承的作用与Python实现。掌握:构造函数__init__()......
  • Java-面向对象(下)
    下面让我们继续学习面向对象类的继承在现有类的基础上去构建一个新的类。现有类叫做基类(baseclass)、超类(superclass)新的类叫做派生类(derivedclass)、子类(孩子类)(childclass)如果一个类想要继承另外一个类,需要用到extends关键字。class基类{}class子类extends......
  • Openlayers的多边形高级交互
    概述本文主要介绍Openlayers中,两个(或多个)多边形的高级交互,包括:并集,交集和差集运算.概念理解并集(Union):并集指的是将两个几何对象的所有区域合并在一起。即,结果是包含了两个对象所有区域的集合。如果两个几何形状有重叠部分,合并时不会重复这些部分。几何......