-------android培训、java培训、期待与您交流!
----------
About 拆箱与装箱、可变参数、枚举
1、基本数据类型的自动拆箱与装箱
Code1
// 自动装箱与拆箱(设计模式:享元设计模式) 整数型-128~127 Integer iObj1 = 127; Integer iObj2 = 127; System.out.println(iObj1==iObj2); System.out.println(iObj1 + 12); Integer iObj3 = Integer.valueOf(12); Integer iObj4 = Integer.valueOf(12); System.out.println(iObj3 == iObj4);
2、可变参数
2.1、问题:一个方法接受的参数个数不固定,例如:
System.out.println(countScore(2,3,5));
System.out.println(countScore(1,2,3,5));
2.2、可变参数的特点:
只能出现在参数列表的最后;
...位于变量类型和变量名之间,前后有无空格都可以;
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
Code2
public static void main(String[] args) { System.out.println(add(2,3)); System.out.println(add(2,3,5)); } public static int add(int x, int ... args) { int sum = x; for (int arg : args) { sum += arg; } return sum; }
3、枚举
3.1、为什么要有枚举
问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
3.2、用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。
3.2.1、私有的构造方法
3.2.2、每个元素分别用一个公有的静态成员变量表示
3.2.3、可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
Code3
public abstract class WeekDay1 { private WeekDay1() { } public static final WeekDay1 SUN = new WeekDay1(){ @Override public WeekDay1 nextDay() { return MON; } }; public static final WeekDay1 MON = new WeekDay1(){ @Override public WeekDay1 nextDay() { return TUE; } }; public static final WeekDay1 TUE = new WeekDay1(){ @Override public WeekDay1 nextDay() { return WEN; } }; public static final WeekDay1 WEN = new WeekDay1(){ @Override public WeekDay1 nextDay() { return THU; } }; public static final WeekDay1 THU = new WeekDay1(){ @Override public WeekDay1 nextDay() { return FRI; } }; public static final WeekDay1 FRI = new WeekDay1(){ @Override public WeekDay1 nextDay() { return SAT; } }; public static final WeekDay1 SAT = new WeekDay1(){ @Override public WeekDay1 nextDay() { return SUN; } }; public abstract WeekDay1 nextDay();//抽象方法 /*public WeekDay nextDay(){ if(this == SUN){ return MON; }else{ return SUN; } }*/ @Override public String toString() { if (this == SUN){ return "星期天"; }else if(this == MON){ return "星期一"; }else if(this == TUE){ return "星期二"; }else if(this == WEN){ return "星期三"; }else if(this == THU){ return "星期四"; }else if(this == FRI){ return "星期五"; }else { return "星期六"; } } }
3.3、枚举的基本应用
举例:定义一个Weekday的枚举。
扩展:枚举类的values,valueOf,name,toString,ordinal等方法
总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。
Code4
public class EnumTest { public static void main(String[] args) { WeekDay1 weekDay = WeekDay1.TUE; System.out.println(weekDay.nextDay()); System.out.println(WeekDay1.FRI.getClass().getName()); System.out.println(WeekDay1.class.getName()); System.out.println("-------------------------"); System.out.println(WeekDay.SUN); System.out.println(WeekDay.valueOf("SAT")); System.out.println(WeekDay.values().length); System.out.println(WeekDay.class.getName()); System.out.println("-------------------------"); System.out.println(TrrificLamp.GREEN.nextLamp().time); System.out.println(TrrificLamp.RED.nextLamp()); } //每个枚举对象都会产生相应的class文件 public enum WeekDay { SUN, MON(1), THU(1), WEN, THI, FRI, SAT; private WeekDay() { System.out.println("First"); } private WeekDay(int day) { System.out.println("Second"); } } // 交通灯枚举实例 public enum TrrificLamp { RED(30) { @Override public TrrificLamp nextLamp() { return GREEN; } }, GREEN(45) { @Override public TrrificLamp nextLamp() { return YELLOW; } }, YELLOW(5) { @Override public TrrificLamp nextLamp() { return RED; } }; public abstract TrrificLamp nextLamp(); private int time; //枚举构造器私有 private TrrificLamp(int time) { this.time = time; } } }
4、枚举的高级应用
4.1、枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
4.2、枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
4.3、带构造方法的枚举
构造方法必须定义成私有的
如果有多个构造方法,该如何选择哪个构造方法?
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
4.4、带方法的枚举
定义枚举TrafficLamp
实现普通的next方法
实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。
增加上表示时间的构造方法
4.5、枚举只有一个成员时,就可以作为一种单例的实现方式。