黑马程序员 19 Java基础加强-01-基础篇

来源:互联网 发布:于正 琼瑶 知乎 编辑:程序博客网 时间:2024/06/02 10:53

               -------android培训java培训、期待与您交流! ----------



本日志doc文档下载



About 拆箱与装箱、可变参数、枚举

 

1、基本数据类型的自动拆箱与装箱

Code1

 

  // 自动装箱与拆箱(设计模式:享元设计模式) 整数型-128~127Integer 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(){@Overridepublic WeekDay1 nextDay() {return MON;}};public static final WeekDay1 MON = new WeekDay1(){@Overridepublic WeekDay1 nextDay() {return TUE;}};public static final WeekDay1 TUE = new WeekDay1(){@Overridepublic WeekDay1 nextDay() {return WEN;}};public static final WeekDay1 WEN = new WeekDay1(){@Overridepublic WeekDay1 nextDay() {return THU;}};public static final WeekDay1 THU = new WeekDay1(){@Overridepublic WeekDay1 nextDay() {return FRI;}};public static final WeekDay1 FRI = new WeekDay1(){@Overridepublic WeekDay1 nextDay() {return SAT;}};public static final WeekDay1 SAT = new WeekDay1(){@Overridepublic WeekDay1 nextDay() {return SUN;}};public abstract WeekDay1 nextDay();//抽象方法/*public WeekDay nextDay(){if(this == SUN){return MON;}else{return SUN;}}*/@Overridepublic 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) {@Overridepublic TrrificLamp nextLamp() {return GREEN;}},GREEN(45) {@Overridepublic TrrificLamp nextLamp() {return YELLOW;}},YELLOW(5) {@Overridepublic 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、枚举只有一个成员时,就可以作为一种单例的实现方式。

原创粉丝点击