java 高新技术
枚举
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。(JDK1.5以上)
EnumTest{
public static void main(String[] args){
WeekDay weekday =Weekday.MON;
System.out.println(weekDay.nextDay());
public class WeekDay{
private WeekDay(){}//加{}表示用这个类的一个子类去创建实例对象
public final static WeekDay SUN=nwe WeekDay();
public final static WeekDay MON=nwe WeekDay();
public void nextDay(){
if(this==SUN){
return MON;
} else {
return SUN;
}
public String toString(){
return this ==SUN?"SUN":"MON";
}
}
可以有若干公有方法或抽象方法,例如,若要提供nextDay方法必须是抽象的。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
枚举的基本应用
写一个基本的枚举类
public class EnumTest{
public static void main(String[] args){
WeekDay1 weekDay = WeekDay.MON;
System.out.println(weekDay.nextDay());
WeekDay weekDay2=WeekDay.FRI;
System.out.println(weekday2);
System.out.println(weekday2.name());
System.out.println(weekday2.ordinal());
System.out.println(WeekDay.valueof("SUN").toString());
System.out.println(WeekDay.value().length);
new Date(300){};
}
public enum WeekDay{//JDK提供的枚举类
SUN{1}//调用第二个带参数的构造方法,MON{}//调用第一个不带参数的构造方法,TUE,WED,THU,FRI,SAT;构造方法都必须位于元素列表之后
private WeekDay(){};
private WeekDay(int day){}
}
public enum TrafficLamp{
RED(30){
public Trafficlamp nextLamp(){
return GREEN;
}
},
GREEN(45){
public Trafficlamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){ublic Trafficlamp nextLamp(){
return RED;
}
};
public abstract Trafficlamp nextLamp();
private in time;
private TrafficLamp(int time){this.time=time;
}
//最复杂了枚举 交通灯
如果枚举只有一个成员时,就可以作为一种单例的实现方式。
Java中的反射
反射的基石--Class类
Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class
Class cls1=字节码1;
Class cls1=字节码2;
Class cls1=Date.class//表示Data在内存中的字节码
P1.getClass()得到实例对象类的字节码
Class.forName("java.lang.String")也是得到那个类的字节码 (返回字节码)
得到字节码的方法(三种):
类名.class,例如,System.class
对象.getClass(),例如,new Date.getClass()
Class.forName("类名"),例如,Class.forName("java.util.Date")
九个预定义的Class对象
除了九个数据类型 还有 void
public class ReflectTest{
public static void main(String[] args) throw Exception{
String str1="abc";
Class cls1=str1.getClass();
Class cls2=String.class;
Class cls3=Class.forName("java.lang.String");
System.out.println(cls1==cls2);
System.out.println(cls1==cls3);
这三者字节码相同 都是同一字节码
System.out.println(cls1.isPrimitive());String不是基本类型的字节码
System.out.println(int.class.isPrimitive());是基本类型的字节码
System.out.println(int.class==Integer.class);不是一样
}
}
数组类型的Class实例对象
ClassArray()
总之,只要是在源程序中出现的类型,都有各自的Class实例对象。例如,int[],void....