contenido:
prefacio
Recientemente, estuve revisando el conocimiento de la parte de JavaSE, grabando algunos conocimientos débiles, métodos de aprendizaje, aprendiendo a través de videos y libros, viendo el video de los 30 días de aprendizaje de Java del Sr. Han Shunping en la estación B y leyendo el conocimiento básico de Java. volumen de tecnología central I en el libro (Libro original 10ª Edición).
Han Shunping aprendió Java en 30 días Dirección: https://www.bilibili.com/video/BV1fh411y7R8?p=425
Una introducción a la enumeración
1. La derivación de la enumeración (enumeración personalizada)
Requisito: Cree un objeto de temporada (Temporada) que contenga el nombre y la descripción de la temporada
package com.dudu.enumerone;
public class Season {
private String name;
private String desc;
public Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
class Test{
public static void main(String[] args) {
Season spring = new Season("春天","温暖");
Season winter = new Season("冬天", "寒冷");
Season summer = new Season("夏天", "炎热");
Season autumn = new Season("秋天", "凉爽");
}
}
El código anterior puede satisfacer nuestras necesidades, pero podemos saber que el objeto de temporada es fijo (primavera, verano, otoño e invierno), y no habrá otras estaciones, si agregamos otro objeto Temporada, este fijo se romperá. ¡Obviamente esta forma no es perfecta!
Mejorar aún más
el análisis de las características del objeto Temporada:
- El valor de la temporada es un número limitado de valores (primavera, verano, otoño, invierno)
- solo lectura, no se requiere modificación
De acuerdo con las características anteriores, diseñe el siguiente código:
package com.dudu.enumerone;
public class Season {
private String name;
private String desc;
public static final Season SPRING = new Season("春天","温暖");
public static final Season WINTER = new Season("冬天", "寒冷");
public static final Season SUMMER = new Season("夏天", "炎热");
public static final Season AUTUMN = new Season("秋天", "凉爽");
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
public void setName(String name) {
this.name = name;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
class Test{
public static void main(String[] args) {
System.out.println("季节:"+Season.SPRING.getName()+"描述:"+Season.SPRING.getDesc());
System.out.println("季节:"+Season.WINTER.getName()+"描述:"+Season.WINTER.getDesc());
System.out.println("季节:"+Season.SUMMER.getName()+"描述:"+Season.SUMMER.getDesc());
System.out.println("季节:"+Season.AUTUMN.getName()+"描述:"+Season.AUTUMN.getDesc());
}
}
Efecto corriente:
Nota:
( 这里的不可修改表示的是无法改为指向其他对象,但其指向的对象本身是可以被修改的。
)
Los objetos de referencia modificados finales no pueden apuntar a otros objetos: el
objeto mismo puede modificarse:
efectos de ejecución:
2. Usa la palabra clave enum
La enumeración (enumeración, enumeración abreviada) es un conjunto de constantes, que pertenecen a una clase especial, que contiene solo un conjunto limitado de objetos específicos.
En el código anterior, la clase Season contiene nada más que cuatro conjuntos de objetos constantes (primavera, verano, otoño, invierno), que están muy en línea con la definición de enumeración, podemos usar la palabra clave enum para lograrlo.
package com.dudu.enumerone;
public enum SeasonEnum {
SPRING("春天","温暖"),
SUMMER("夏天","炎热"),
AUTUMN("秋天","凉爽"),
WINTER("冬天","寒冷")
;
private SeasonEnum(String name, String desc) {
this.name = name;
this.desc = desc;
}
private String name;
private String desc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
class Test_Enum{
public static void main(String[] args) {
System.out.println("季节:"+SeasonEnum.SPRING.getName()+"描述:"+SeasonEnum.SPRING.getDesc());
System.out.println("季节:"+SeasonEnum.WINTER.getName()+"描述:"+SeasonEnum.WINTER.getDesc());
System.out.println("季节:"+SeasonEnum.SUMMER.getName()+"描述:"+SeasonEnum.SUMMER.getDesc());
System.out.println("季节:"+SeasonEnum.AUTUMN.getName()+"描述:"+SeasonEnum.AUTUMN.getDesc());
}
}
resultado de ejecución:
Encontraremos que SeasonEnum (usando la palabra clave enum) está muy familiarizado con la clase Season diseñada anteriormente, con solo dos diferencias:
- Season usa la palabra clave Class, que es una clase, mientras que SeasonEnum usa la palabra clave enum
- Los objetos constantes en SeasonEnum son similares a la taquigrafía de Season
De hecho, la clase Season también es una forma de implementar la enumeración, es decir, un tipo de enumeración personalizado.
Código fuente descompilado de la clase Season: Código
fuente descompilado SeasonEnum ( enum关键字本质上还是一个类(class),只是该类会继承Enum抽象类
):
3. Notas (la palabra clave enum implementa la enumeración)
- Cuando usamos la palabra clave enum para desarrollar una clase de enumeración, heredará la clase Enum de forma predeterminada y es una clase final.
public static final Season SPRING = new Season("春天","温暖");
El método tradicional ( ) se simplifica aSPRING("春天","温暖"),
, aquí debe saber a qué constructor llama- Si el objeto de enumeración se crea utilizando el constructor sin argumentos, se pueden omitir tanto la lista de argumentos como los paréntesis.
- Cuando hay varios objetos de enumeración, use el
,
intervalo y termine con un punto y coma al final;
- El objeto de enumeración debe colocarse al principio de la línea de enumeración
Si se crea un objeto de enumeración utilizando el constructor sin argumentos, se pueden omitir tanto la lista de argumentos como los paréntesis:
el objeto de enumeración debe colocarse al principio de la línea de enumeración:
2. El uso de la enumeración
Requisitos, use el constructor sin argumentos, cree una enumeración de color (Color), que contenga tres constantes (ROJO, VERDE, AMARILLO)
el código se muestra a continuación:
package com.dudu.enumerone;
public enum Color {
RED,
GREEN,
YELLOW
;
}
class Test_ColorEnum{
public static void main(String[] args) {
Color color = Color.RED;
Color color1 = Color.RED;
System.out.println(color);
System.out.println(color == color1);
}
}
resultado de ejecución:
- El primer resultado
RED
es el nombre devuelto por Color al llamar al método toString() de la clase principal Enum (el nombre aquí es RED)
- La segunda salida devuelve
true
, esto se debe a que RED es una constante estática que actúa sobre la clase (la dirección y el valor son los mismos), y color y color1 apuntan a la misma dirección
3. Métodos comunes de enumeración
Descripción: al usar la palabra clave enum, la clase Enum se heredará implícitamente, de modo que podamos usar los métodos relacionados de la clase Enum.
package com.dudu.enumerone;
public class EnumMethod {
public static void main(String[] args) {
// name():返回枚举对象的名字
System.out.println(SeasonEnum.AUTUMN.name());
// ordinal():返回枚举对象的次序(从0开始编号)
System.out.println(SeasonEnum.AUTUMN.ordinal());
// values():返回定义的所有枚举对象
SeasonEnum[] seasonEnums = SeasonEnum.values();
for (SeasonEnum seasonEnum:seasonEnums){
System.out.println(seasonEnum);
}
// valueOf():将字符串转换成枚举对象,要求该字符串必须为已有的常量名,否则会报错
SeasonEnum seasonEnum = SeasonEnum.valueOf("SPRING");
System.out.println(seasonEnum.getName());
// compareTo():比较二个枚举常量,比较的是编号(前一个的编号减后一个的编号) self.ordinal - other.ordinal
System.out.println("SPRING的编号为"+SeasonEnum.SPRING.ordinal());
System.out.println("AUTUMN的编号为"+SeasonEnum.AUTUMN.ordinal());
System.out.println("SPRING的编号 - AUTUMN的编号为"+(SeasonEnum.SPRING.ordinal()-SeasonEnum.AUTUMN.ordinal()));
System.out.println("SPRING和AUTUMN比较的编号为"+SeasonEnum.SPRING.compareTo(SeasonEnum.AUTUMN));
}
}
resultado de ejecución:
4. Detalles de uso de la enumeración
- Después de usar la palabra clave enum, no se pueden heredar otras clases, porque enum heredará implícitamente Enum, y Java es un mecanismo de herencia único.
- Al igual que las clases ordinarias, las clases de enumeración pueden implementar interfaces, como:
enum 类名 implements 接口1,接口2{}
Después de usar la palabra clave enum, no se pueden heredar otras clases:
Al igual que las clases ordinarias, las clases de enumeración pueden implementar interfaces:
resultado de ejecución: