1Z0-809复习 第1章 ENUM值
Advanced Class Design
Reviewing OCA Concepts
Access Modifiers
Overloading and Overriding
Abstract Classes
Static and Final
Imports
Using instanceof
Understanding Virtual Method Invocation
Annotating Overridden Methods
Coding equals, hashCode, and toString
toString
equals
hashCode
Working with Enums
public enum Season { WINTER, SPRING, SUMMER, FALL //没有分号 }
Enum值最后是没有分号的。
Enum和常数的区别在于,其是Type Safe,也就是在编译之前就知道这些成员变量的type。
enum包含的是static变量,以及helper method。
Season s = Season.SUMMER;
关于这个用法稍微有点违和感,貌似把类的成员变量赋予了类。
System.out.println(s == Season.SUMMER); // true
看上去像是两个字符串用等号来比较,有违和感。
可以想象成这是两个一开始就定义好的static final的变量。
这样用等号就没有违和感了。
当enum的toString()起作用时,取得是enum的name。
for(Season season: Season.values()) { System.out.println(season.name() + " " + season.ordinal()); } System.out.println(Season.SPRING.name() + " " + Season.SPRING.ordinal());
这个看上去也有违和感。是因为Season的静态方法values()会取得其中的所有元素。
循环这个array,用name()方法取得每个元素的名字。用ordinal()方法,取得每个元素的值。
可以看出来每一个元素都有一个name和一个顺序int值。
Season s1 = Season.valueOf("SUMMER"); // SUMMER Season s2 = Season.valueOf("summer"); // java.lang.IllegalArgumentException
可以用完全一模一样的字符串创建一个enum。
Season.SPRING.values(); // Season的所有元素,少用 Season.values(); // Season的所有元素,相同
Using Enums in Switch Statements
Season summer = Season.SUMMER; switch (summer) { //这个用法是错的,因为: //Season.WINTER是一个enum,并不是enum的int //WINTER可以称为一个enum的value,是case可以接受的类型。 //Season可以称作enum的type。 case Season.WINTER: System.out.println("Get out the sled!"); break; case SUMMER: System.out.println("Time for the pool!"); break; default: System.out.println("Is it summer yet?"); }
最终针对Season.SUMMER了解几个概念:
Adding Constructors, Fields, and Methods
public enum Season { WINTER("Low"), SPRING("Medium"), SUMMER("High"), FALL("Medium"); //成员变量 private String expectedVisitors; //构造函数 private Season(String expectedVisitors) { this.expectedVisitors = expectedVisitors; } //成员方法 public void printExpectedVisitors() { System.out.println(expectedVisitors); } }
- 如果enum类里面只有value的一行,那么最后一个分号是可以省略的。
像上面的情况,最后一个分号就不可以省略。 - 构造方法的修饰词必须是private,因为只可以在enum之内被调用。public是无法通过编译的。
- 构造函数可以看出来,是将方法的形参赋给成员变量。 再看第一行的定义就明白了,Low,Medium,High就是形参的具体值。
Season.SUMMER.printExpectedVisitors();
执行结果是High,因为SUMMER("High")调用构造函数把High赋给了SUMMER 另一enum的用法:
public enum Season { WINTER { @Override public void printHours() { System.out.println("9am-3pm"); } }, SPRING { @Override public void printHours() { System.out.println("9am-5pm"); } }, SUMMER { @Override public void printHours() { System.out.println("9am-7pm"); } }, FALL { @Override public void printHours() { System.out.println("9am-5pm"); } }; public abstract void printHours(); }
Season summer = Season.SUMMER; summer.printHours();