现在的位置: 首页 > 综合 > 正文

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

2018年05月28日 ⁄ 综合 ⁄ 共 3662字 ⁄ 字号 评论关闭

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



本日志doc文档下载



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、枚举只有一个成员时,就可以作为一种单例的实现方式。

抱歉!评论已关闭.