《黑马程序员》枚举及自动装箱和拆箱

来源:互联网 发布:数据库开发软件 编辑:程序博客网 时间:2024/05/16 15:17
------- android培训、java培训、期待与您交流! ----------

枚举及自动装箱和拆箱

第十二集 枚举 

/**
 * 为什么要用枚举
 * 问题:定义星期几或性别的变量,该怎么定义?
 * 假设用1-7分别表示星期一到星期日,但有人可能会写成int weekDay = 0;
 * 枚举就是要让某个类型的变量取值只能为若干个固定值中的一个,否则,编译器就会报错。
 * 枚举可以让编译器在编译时就可以控制源程序中填写的错误信息,普通的变量的方式在开发阶段无法实现这一目标
 * 
 * 用普通枚举如何实现枚举的功能,定义一个WeekDay的类来模拟枚举功能。
 * --私有的构造方法
 * --每个元素分别用一个公有的静态变量表示
 * --可以有若干个公有方法或抽象方法,例如,要提供nextDay()方法必须是抽象的。
 * 采用抽象方法定义nextDay()就将大量的if else 语句转移成一个个独立的类
 * 
 * 枚举的基本应用
 * --举例:定义一个WEekDay的枚举
 * 扩展:枚举类的values,valueOf,toString,ordinal等方法
 * 总结:枚举是一种特殊的类,其中每个元素都是该类的一个实例对象,
 * 例如可以调用WeedDay.SUN.getClass().getName和WeekDay.class.getName()。
 * 
 * 
 * 枚举就相当于一个类,其中也可以定义构造方法,成员变量,和普通方法和抽象方法
 * 枚举元素必须位于枚举体中的最开始的部分,枚举元素列表的后要有分号与其他成员分隔。
 * 把枚举中的成员方法或者变量等放在枚举元素的前面,编译器报告错误。
 * 带构造方法的枚举
 * --构造方法必须定义成私有的。
 * --如果有多个构造方法,该如何选择哪个构造方法?
 * --枚举元素MON和MON()的效果一样,都是默认调用的构造方法。
 * 带方法的枚举
 * --定义枚举TrafficLamp
 * --实现普遍的next方法
 * --实现抽象的next方法:每个元素分别是由枚举的子类来生成的实例对象,这些子类采用类似内部类的方法定义
 * --增加上表时间的方法
 * 枚举只有一个成员时,就可以作为一种单例的实现方式 
 */


概念:
枚举就是让某些类型的变量只能取若干固定值中的一个,否则编译就会报错,枚举可以让编译器的在编译时就确定源文件中错误数据。


枚举本质:
限定一个类的实例对象的数量,当一个类的实例化对象的数量是在限定范围内,那么就可以定义这个类为一个枚举类型。


枚举的实现:

1.枚举类也是一种特殊形式的Java类,使用enum定义枚举类。

2.枚举类中声明的每一个枚举值代表枚举类的一个实例对象。

3.与java中普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数。

4.所有自定义的枚举都继承Enum这个类。

5.格式:

enum 枚举名称{   枚举值1,枚举值2,枚举值3.....}

6.使用:可以使用 枚举名称.枚举值来调用每个枚举对象。

枚举成员:

1.枚举值:枚举值是一个常量,也可以称作枚举常量,通过javap命令可以看到,每个枚举值的修饰符是 public final static ,系统会自动添加这些修饰符。

2.成员变量:枚举中也有成员变量。

3.构造方法:枚举中也有一个无参的默认的构造方法,因为对应的枚举常量的数量是在限定范围内,不能再创建其他对应的枚举常量,所有构造方法是私有化的。一旦创建了有参的构造方法,无参的构造方法也就会消失。

4.一般方法:可以有一般方法,每个枚举值可调用。

5.抽象方法:枚举中可以存在抽象方法。一旦有抽象方法,每个枚举值必须要覆写这个抽象方法,格式类似于匿名内部类的写法.


 枚举值(){


    被覆写的抽象方法(){ }


}


package cn.itcast.day1;

import java.util.Date;


public class EnumTest {

/**
* 第十二集 枚举 
* @param args
* 定义了一个新的类型WeekDay
* 以后用到这个类型里面的值只能是我提前定义好的值
* 如果不是里面的值,编译器都不让通过,在编译的时候就发现不合法

*/

/**
* 第十三集 枚举 举例
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
WeekDay1 weekDay = WeekDay1.MON;
System.out.println("11--"+weekDay.nextDay());

WeekDay weekDay2 = WeekDay.FRI;
System.out.println("22--"+weekDay2);
System.out.println("33--"+weekDay2.name());
/**
* 此元素FRI在枚举中第几个位置
*/
System.out.println("44--"+weekDay2.ordinal());

System.out.println("55--"+weekDay2.compareTo(weekDay2));
/**
* 得到这个元素属于哪个类
*/
System.out.println("66--"+weekDay2.getClass());
System.out.println("77--"+WeekDay.valueOf("SUN"));
System.out.println("88--"+WeekDay.values().length);

new Date();
}

public enum WeekDay{
/**
* 在这个元素的后面有一括号,再指向一个参数,指定参数列表
* 表示创建实例对象的时候用到哪个构造方法
*/
SUN(1),MON,TUE,WED,THI,FRI,SAT;
private WeekDay(){System.out.println("first");}
private WeekDay(int day){
System.out.println("second");
}
}

public enum TrafficLamp{
/**
* RED是这个类TrafficLamp的子类的实例对象
* RED是由这个类TrafficLamp的子类来写的,这个子类的名字不知道
* 既然是子类就必须完成父类的方法
* 交通灯里面有三个匿名的类
*/
RED(30) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return GREEN;
}
},GREEN(45) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return YEELLOW;
}
},YEELLOW(5) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return RED;
}
};
public abstract TrafficLamp nextLamp();
/**
* 私有成员变量
* 每个灯都有自己的时间
*/
private int time;
/**
* 每个灯都有自己的时间是怎么构成?
* 通过构造方法。必须写成私有的
*/
private TrafficLamp(int time){
this.time = time;
};
}


}

第十一集 自动装箱和拆箱

package cn.itcast.day1;


public class AutoBox {

/**
* 第十一集 自动装箱和拆箱
* @param args
*/
public static void main(String[] args) {
/**
* 自动装箱
* 自动把一个基本数据类型装成Integer对象赋值给了引用变量
*/
Integer iObj = 3;
/**
* 拆箱
* Integer对象不支持加法,必须转换成基本数据对象,
* 基本整数在进行加法
*/
System.out.println(iObj + 12);

String s1 = new String("abc");
String s2 = new String("abc");

/**
* 运行结果 15 true false* 对于基本类型的整数装箱称为Integer对象的时候  * 如果这个数字在一个字节之内(-128——127)之间  * 一旦包装称为一个Integer对象之后就会把它缓存起来 * 装在一个池里面,下次再调用的时候,先看有没有 * 有的话,直接从池里面拿来,节省了内存空间* 这个对象不怎么改变 * 这种设计叫做一种设计模式 * 当这个数据很小,有好多的对象都用,就搞一个对象大家都用* 叫做享元模式  flyweight  * 有很多小的对象他们有很多属性相同,把他们变成一个对象 * 那些不同的属性把他们变成方法的参数称之为外部状态* 那些相同的属性称之为内部状态 * 小的整数使用的频率比较高* 大的整数的使用频率比较低
*/


Integer i1 = 13;
Integer i2 = 13;
System.out.println(i1==i2);
Integer i3 = 137;
Integer i4 = 137;
System.out.println(i3==i4);

Integer i5 = Integer.valueOf(127);
Integer i6 = Integer.valueOf(127);
System.out.println(i5==i6);
Integer i7 = Integer.valueOf(128);
Integer i8 = Integer.valueOf(128);
System.out.println(i7==i8);



}


}

------- android培训、java培训、期待与您交流! ----------
0 0
原创粉丝点击