java:JDK1.5枚举和注解新特性总结
- 枚举
语法:
enum Color{
RED,BLUE,GREEN;
}
使用enum关键字定义的枚举结构实际上是默认继承了Enum类的枚举类。
Enum类中存在两大属性
name:枚举对象名称
ordinal:枚举对象数字下标
例子:
enum Color{
RED,GREEN,BLUE;
}
public class Test {
public static void main(String[] args) {
Color color = Color.RED;
System.out.println(color.ordinal()+"="+color.name());
}
}
public final String name:取得枚举对象名称
public final int ordinal:取得枚举对象下标
enum Color{
RED,GREEN,BLUE;
}
public class Test {
public static void main(String[] args) {
Color color = Color.RED;
System.out.println(color.ordinal()+"="+color.name());
System.out.println(color);
}
}
我们用多例模式写上述代码:
class Color{
private String title;
public static final int RED_FLAG = 1;
public static final int GREEN_FLAG = 5;
public static final int BLUE_FLAG = 10;
private static final Color RED = new Color("红");
private static final Color GREEN = new Color("绿");
private static final Color BLUE = new Color("蓝");
private Color(String title){
this.title = title;
}
public static Color getInstance(int flag){
switch(flag){
case RED_FLAG:
return RED;
case GREEN_FLAG:
return GREEN;
case BLUE_FLAG:
return BLUE;
default:
return null;
}
}
@Override
public String toString() {
return this.title;
}
}
public class Test{
public static void main(String[] args) {
Color color = Color.getInstance(Color.RED_FLAG);
System.out.println(color);
}
}
取得所有枚举类对象
枚举类.values( )
enum Color{
RED,GREEN,BLUE;
}
public class Test{
public static void main(String[] args) {
for(Color color:Color.values()){
System.out.println(color);
}
}
}
1.1 枚举中定义其他结构
枚举中若定义其他构造方法,构造方法必须用private封装
枚举中若定义其他结构,枚举对象声明必须放在枚举类的首行。
enum Color{
RED("红"),GREEN("绿"),BLUE("蓝");
private String title;//这句不能放在首行
private Color(String color){
this.title = title;
}
}
public class Test{
public static void main(String[] args) {
for(Color color:Color.values()){
System.out.println(color);
}
}
}
1.2 枚举实现接口
枚举中的对象会自动变为接口对象
interface IColor{
String color();
}
enum Color implements IColor{
RED("红"),GREEN("绿"),BLUE("蓝");
private String title;
private Color(String title){
this.title = title;
}
@Override
public String toString() {
return this.title;
}
public String color(){
return this.name();
}
}
public class Test{
public static void main(String[] args) {
for(Color color : Color.values()){
System.out.println(color);
}
IColor color = Color.RED; //枚举类对象,通过向上转型转型成color
System.out.println(color);
System.out.println(color.color());
}
}
- 注解
注解的产生:
class Person{
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
private String name;
private Integer age; //构造方法,get、set方法太多,很麻烦
public String getName() {
return name;
} //用注解可以不用写上述很多的方法
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
2.1 @Override 准确覆写
当子类覆写父类方法时,此注解检查覆写的方法是否正确声明,只有满足覆写方法要求才会编译通过,否则编译出错。
class Person{
// @Override 加上此注解后,会提示你覆写失败,让你检查错误
public String tostring(){ //此时编译没报错,但运
return "hello world"; // 行结果表明没有成功覆写toString方法
}
}
public class Test{
public static void main(String[] args) {
Person per = new Person();
System.out.println(per);
}
}
2.2 @Deprecated 过期声明
建议用户不使用原有的类&方法时,可以在类或方法上@Deprecated表示当前版本中不推荐使用。
class Person{
private String name;
@Deprecated //过期注释,JDK更新,一些老方法不再推荐使用
public Person(){
System.out.println("******");
}
public Person(String name){
System.out.println(name+"******");
}
}
public class Test{
public static void main(String[] args) {
Person per1 = new Person(); //过期方法,能用,但是不推荐使用
Person per2 = new Person("张三");
}
}
2.3 @SuppressWarings 压制警告
调用某些操作可能产生问题的时候会出现警告信息,但是警告信息并不是异常。
class Person{
}
public class Test{
public static void main(String[] args) {
@SuppressWarnings({"rawtypes","unused" })
Person person = new Person(); //此时三个Person下都会出现黄色波浪线
// 第一个没说明Person类型,第二个没被使用,第三个没说明类型
//应改为Person<String> person = new Person<>();
//但也可以不改,在出错的上一行加上警告压制,就不会报错了
//@SuppressWarnings({"rawtypes","unused" })
}
}