(1)枚举类对象的属性不应允许被改动,所以应该使用 private final 进行修饰;
(2)枚举类使用 private final 修饰的属性应该在构造器中为其赋值;
(3)枚举类的构造器要私有化,保证不能在类的外部创建其对象,否则就不能确定对象的个数;
(4)在枚举类内部创建的枚举类的实例(枚举)对象,要声明为:public static final。
下面就拿季节举例,来自定义一个枚举类。
public class Season {
//1.声明Season对象的属性,又因为枚举类对象的属性不应允许被改动, 所以应该使用 private final修饰
//枚举类的使用 private final 修饰的属性应该在构造器中为其赋值
private final String seasonName;
private final String seasonDesc;
//2.私有化构造器,保证不能在类的外部创建其对象,否则就不能确定对象的个数
private Season(String seasonName,String seasonDesc){
this.seasonName=seasonName;
this.seasonDesc=seasonDesc;
}
//3.提供当前枚举类的多个枚举对象,又因为枚举类是不可变的常量类,所以需要声明为:public static final
public static final Season SPRING=new Season(“春天”,“鸟语花香”);
public static final Season SUMMER=new Season(“夏天”,“夏日炎炎”);
public static final Season AUTUMN=new Season(“秋天”,“秋高气爽”);
public static final Season WINNER=new Season(“冬天”,“寒风瑟瑟”);
//其他需求1:获取枚举类对象的属性
//只需要提供属性的get方法即可,但是不能提供set方法,因为枚举类是不可变的常量类,不能被修改
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//其他需求2:打印对象,提供toString方法即可
@Override
public String toString() {
return “Season{” +
“seasonName='” + seasonName + ‘’’ +
“, seasonDesc='” + seasonDesc + ‘’’ +
‘}’;
}
}
public class SeasonTest {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring); //Season{seasonName=‘春天’, seasonDesc=‘鸟语花香’}
}
}
在JDK 1.5 中新增了enum关键字用于定义枚举类,但是在使用时需要注意以下几点:
(1)使用 enum 定义的枚举类默认继承了 java.lang.Enum类,因此不能再继承其他类;
(2)使用 enum 定义的枚举类默认使用final进行修饰,不可以被继承;(也从侧面说明了它是一个常量类)
(3)枚举类的构造器只能使用 private 权限修饰符;
(4)枚举类的所有实例必须在枚举类中显式列出,多个对象之间使用",“隔开,末尾使用”;"结束。
列出的实例系统会自动添加 public static final 进行修饰;
(5)必须在枚举类的第一行声明枚举类对象;
(6)若枚举类只有一个枚举对象, 则可以作为一种单例模式的实现方式。
下面还是使用季节举例,来自定义一个枚举类。
//使用enum关键字定义枚举类
public enum Season2 {
//1.提供当前枚举类的对象,多个对象之间使用",“隔开,末尾使用”;"结束
//系统默认使用public static final修饰
SPRING(“春天”,“鸟语花香”),
SUMMER(“夏天”,“夏日炎炎”),
AUTUMN(“秋天”,“秋高气爽”),
WINNER(“冬天”,“寒风瑟瑟”);
//2.声明Season对象的属性,又因为枚举类对象的属性不应允许被改动, 所以应该使用 private final修饰
private final String seasonName;
private final String seasonDesc;
//3.枚举类的构造器只能使用 private 权限修饰符
// 私有化构造器是为了保证不能在类的外部创建其对象,否则就不能确定对象的个数
private Season2(String seasonName, String seasonDesc){
this.seasonName=seasonName;
this.seasonDesc=seasonDesc;
}
//其他需求:获取枚举类对象的属性
//只需要提供属性的get方法即可,但是不能提供set方法,而且也不允许提供set方法,因为枚举类是不可变的常量类,不能被修改
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
}
public class SeasonTest {
public static void main(String[] args) {
Season2 spring = Season2.SPRING;
System.out.println(spring);//SPRING
}
}
2、Enum类中的常用方法
values()方法:返回枚举类型的对象数组,该方法可以很方便地遍历所有的枚举值;
//使用方法如下:
Season2[] seasons = Season2.values();
for (int i = 0; i < seasons.length; i++) {
System.out.println(seasons[i]);
}
valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。
如不是,会报运行时异常:IllegalArgumentException;
//使用方法如下:
Season2 spring = Season2.valueOf(“SPRING”);
System.out.println(spring);//SPRING
toString():返回当前枚举类对象的名称
//使用方法如下:
Season2 spring = Season2.SPRING;
System.out.println(spring.toString());//SPRING
3、使用enum关键字定义枚举类实现接口
枚举类和普通类一样,可以实现一个或多个接口。枚举类实现接口分为两种情况:
情况一:若枚举类的所有枚举对象在调用实现的接口方法时,呈现相同的行为方式,则只要统一实现该方法即可;此时与普通类实现接口一样,没有任何区别。
public interface Show {
void show();
}
//使用enum关键字定义枚举类
public enum Season2 implements Show{
//1.提供当前枚举类的对象,多个对象之间使用",“隔开,末尾使用”;"结束
//系统默认使用public static final修饰
SPRING(“春天”,“鸟语花香”),
SUMMER(“夏天”,“夏日炎炎”),
AUTUMN(“秋天”,“秋高气爽”),
WINNER(“冬天”,“寒风瑟瑟”);
//2.声明Season对象的属性,又因为枚举类对象的属性不应允许被改动, 所以应该使用 private final修饰
private final String seasonName;
private final String seasonDesc;
//3.枚举类的构造器只能使用 private 权限修饰符
// 私有化构造器是为了保证不能在类的外部创建其对象,否则就不能确定对象的个数
private Season2(String seasonName, String seasonDesc){
this.seasonName=seasonName;
this.seasonDesc=seasonDesc;
}
//其他需求:获取枚举类对象的属性
//只需要提供属性的get方法即可,但是不能提供set方法,而且也不允许提供set方法,因为枚举类是不可变的常量类,不能被修改
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//重写show()方法,与普通类实现接口一样,没有任何区别
@Override
public void show() {
System.out.println(“一年四季:春夏秋冬”);
}
}
public class SeasonTest {
public static void main(String[] args) {
Season2 spring = Season2.SPRING;
spring.show();
Season2 summer = Season2.SUMMER;
summer.show();
Season2 autumn = Season2.AUTUMN;
autumn.show();
Season2 winner = Season2.WINNER;
winner.show();
}
}
运行结果:
情况二:若枚举类的每个枚举对象在调用实现的接口方法时,需要呈现出不同的行为方式,则可以让每个枚举对象分别来实现该方法
public interface Show {
void show();
}
//使用enum关键字定义枚举类
public enum Season2 implements Show{
//1.提供当前枚举类的对象,多个对象之间使用",“隔开,末尾使用”;"结束
//系统默认使用public static final修饰
SPRING(“春天”,“鸟语花香”){
//每个枚举对象分别来实现该方法
@Override
public void show() {
System.out.println(“春天是一个鸟语花香的季节!”);
}
},
SUMMER(“夏天”,“夏日炎炎”){
@Override
public void show() {
System.out.println(“夏天是一个夏日炎炎的季节!”);
}
},
AUTUMN(“秋天”,“秋高气爽”){
@Override
public void show() {
System.out.println(“秋天是一个秋高气爽的季节!”);
}
},
WINNER(“冬天”,“寒风瑟瑟”){
@Override
public void show() {
System.out.println(“冬天是一个寒风瑟瑟的季节!”);
}
};
//2.声明Season对象的属性,又因为枚举类对象的属性不应允许被改动, 所以应该使用 private final修饰
private final String seasonName;
private final String seasonDesc;
//3.枚举类的构造器只能使用 private 权限修饰符
// 私有化构造器是为了保证不能在类的外部创建其对象,否则就不能确定对象的个数
private Season2(String seasonName, String seasonDesc){
this.seasonName=seasonName;
this.seasonDesc=seasonDesc;
}
//其他需求:获取枚举类对象的属性
//只需要提供属性的get方法即可,但是不能提供set方法,而且也不允许提供set方法,因为枚举类是不可变的常量类,不能被修改
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
}
public class SeasonTest {
public static void main(String[] args) {
Season2 spring = Season2.SPRING;
spring.show();
Season2 summer = Season2.SUMMER;
summer.show();
Season2 autumn = Season2.AUTUMN;
autumn.show();
Season2 winner = Season2.WINNER;
winner.show();
}
}
运行结果:
4、枚举类对switch的语句的影响
Java1.5新增enum关键字的同时,也扩大了switch的语句使用范围。Java1.5之前,switch中的值只能是简单数据类型,比如int、byte、short、char, 有了枚举类型之后,就可以使用枚举类的对象了。同时在switch表达式中使用enum定义的枚举类的对象作为表达式时, case子句可以直接使用枚举对象的名字, 无需添加枚举类作为限定。这样一来,程序的控制选择就变得更加的方便,看下面的例子:
public enum WeekDay {
// 定义一周七天的枚举类型
Monday,Tuesday, Wednesday ,Thursday,Friday,Saturday,Sunday;
}
class Test{
public static void getDay(WeekDay weekDay){
switch (weekDay){
case Monday:
System.out.println(“Today is Monday”);
break;
case Tuesday:
System.out.println(“Today is Tuesday”);
break;
case Wednesday:
System.out.println(“Today is Wednesday”);
break;
case Thursday:
System.out.println(“Today is Thursday”);
break;
case Friday:
System.out.println(“Today is Friday”);
break;
case Saturday:
System.out.println(“Today is Saturday”);
break;
case Sunday:
System.out.println(“Today is Sunday”);
break;
default:
System.out.println(“data error”);
}
}
public static void main(String[] args) {
WeekDay sunday = WeekDay.Sunday;
getDay(sunday);
WeekDay friday = WeekDay.Friday;
getDay(friday);
}
如何快速更新自己的技术积累?
- 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
- 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
- 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
- 学习以后不知道有没有学成,则可以通过面试去检验。
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目
default:
System.out.println(“data error”);
}
}
public static void main(String[] args) {
WeekDay sunday = WeekDay.Sunday;
getDay(sunday);
WeekDay friday = WeekDay.Friday;
getDay(friday);
}
如何快速更新自己的技术积累?
- 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
- 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
- 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
- 学习以后不知道有没有学成,则可以通过面试去检验。
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目
[外链图片转存中…(img-nAD9r9CN-1714167447698)]
[外链图片转存中…(img-UpbuTx69-1714167447699)]