------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
兴趣是学习编程最好的老师
不积跬步,无以至千里
这辈子没办法做太多事情,所以每一件都要做到精彩绝伦。
<枚举>
1.枚举相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象法。
枚举是通过enum关键字定义枚举类,枚举类是一个特殊的类,每个元素都是该类的一个实例对象。
枚举元素必须位于枚举体的最开始部分,其后要有分号与其隔开,如果将枚举中的成员方法或成员变量等放在枚举元素的前面,编译器报错。
枚举只有一个成员时,就可以作为一种单例的实现方式。
2.为什么要有枚举
问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
例如:
私有的构造方法
每个元素分别用一个公有的静态成员变量表示
可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
<span style="font-size:18px;">public abstract class WeekDay1 {
private WeekDay1(){}
public final static WeekDay1 SUN = new WeekDay1(){
public WeekDay1 nextDay() {
return MON;
}
};
public final static WeekDay1 MON = new WeekDay1(){
public WeekDay1 nextDay() {
return SUN;
}
};
public abstract WeekDay1 nextDay();
public String toString(){
return this==SUN?"SUN":"MON";
}
}
</span>
3.枚举方法
构造方法:枚举的构造方法必须定义为私有的。
如果有多个构造方法,通过传入的不同类型的参数调用构造方法。
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
非静态方法:String toString() ; 获取枚举的名称
String name(); 获取此枚举常量的名称
Class getClass() ; 获取对应的类名
int ordinal() ; 获取枚举值在枚举类中的顺序
静态方法:valueOf(String e) ;转为对应的枚举对象
values() ; 获取所有的枚举对象元素
<span style="font-size:18px;">public class EnumDemo {
public static void main(String[] args) {
WeekDay weekDay=WeekDay.MON;
System.out.println(weekDay);
System.out.println(weekDay.name()); //获取对象名
System.out.println(weekDay.getClass()); //获取对应类
System.out.println(weekDay.toString()); //获取枚举对象名
System.out.println(weekDay.ordinal()); //获取此对象在枚举常量的次序
System.out.println(WeekDay.valueOf("WED")); //将字符串转化为枚举常量
System.out.println(WeekDay.values().length); //获取所以的枚举元素,并打印其长度 。length是一个属性
}
//定义枚举内部类
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");
}
}
}
</span>
4.实现带有抽象方法的枚举
枚举中的常量需要子类来实现,这是可以利用内部类的方式来定义枚举常量
<span style="font-size:18px;">public class EnumTest {
public enum TrafficLamp{
RED(25){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(30){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
private int time;
//构造器
private TrafficLamp(int time){
this.time=time;}
//抽象方法
public abstract TrafficLamp nextLamp();
}
} </span>
<JDK1.5部分新特性>
1.自动拆装箱
基本数据类型和包装类之间可以自动的互相转换
基本数据类型——封装类:
基本数据类型 包装类型
byte Byte
short Short
int Integer
long Long
char Character
boolean Boolean
float Float
double Double
2.增强for循环
格式 for(变量类型 变量 :需迭代的数组或集合){}
强for循环不需要使用角标,循环中要用到元素角标的话必须使用普通for循环
3.可变参数
格式: public void fun(int … args){
}
可变参数只能放置在参数的最后
编译器会将可变传数看成一个一维数组
4.静态导入
静态导入是用于导入类的某个静态属性或方法,简化其程序对类静态属性和方法的调用。
格式: import static 包名.类名.静态属性.静态方法; import static java.lang.Math
5.泛型
泛型能将运行时期的错误,转移到了编译时期,去除黄色警告提示,但是只能放该类型或该类型的子类型对象,其他的都不允许放。
public static void main(String[] args) {
demo1();
ArrayList<Integer> list = new ArrayList<>(); //1.7新特性,菱形泛型
list.add(123);
System.out.println(list);
}
private static void demo1() {
ArrayList<Person> list = new ArrayList<Person>();
list.add("a");
list.add(123);
Iterator<Person> it = list.iterator();
while(it.hasNext()) {
Person p = it.next();
System.out.println(p.getName() + "..." + p.getAge());
}
}
}