枚举
枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,都是静态常量当变量的取值有限且固定时,可以使用枚举
可以有若干公有方法或抽象方法。
枚举中的其他成分必须放在枚举元素之后定义,并以分号隔开
构造方法必须为私有
在元素后面加括号并添加参数看列表来标示所使用的构造函数
采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
枚举中有抽象类时,在定义元素时必须有实现了抽象方法的匿名子类来创建
public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.time = time;}
}
}
枚举中的其他成分必须放在枚举元素之后定义,并以分号隔开
构造方法必须为私有
在元素后面加括号并添加参数看列表来标示所使用的构造函数
采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
枚举中有抽象类时,在定义元素时必须有实现了抽象方法的匿名子类来创建
枚举只有一个成员时,可以作为一种单例的实现方式。
public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.time = time;}
}
}
反射------------基于Class类--描述Java类的Java类
Field----成员变量、Method---方法、Constructor---构造函数
l反射就是把Java类中的各种成分映射成相应的java类
l
如何得到各个字节码对应的实例对象( Class类型)
Ø类名.class,例如,System.class
Ø对象.getClass(),例如,new Date().getClass()
ØClass.forName("类名"),例如,Class.forName("java.util.Date");
可以通过Class的getConstructor()函数来获得类的构造函数,传入的参数列表为相应的构造函数的参数列表
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
可以通过Constructor的newInstance()来创建类的相应实例
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
还可以用Class类的newInstance()函数来创建对象,不过这个函数只能调用相应类的默认构造函数创建实例
Field----成员变量
Field fieldY = pt1.getClass().getField("y");
fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值
通过Field类的get()方法来访问具体对象的变量,参数为具体的对象
fieldY.get(pt1);
当类的变量为私有时,不能用getField()函数来取,可以用getDeclaredField()函数来取
Field fieldX = pt1.getClass().getDeclaredField("x");
即使取到了私有变量,也还是不能访问,需要用Field类的setAccessible(true)函数将变量设为课访问的
fieldX.setAccessible(true);
fieldX.get(pt1);
Field的set()函数可以给对象上相应的变量赋值
fieldY.set(pt1,4);
Method---方法
Methon代表类的一个成员方法
通过Class类的getMethon()函数可以获得类的相应方法,参数为方法名和方法所需的参数类型
Method methodCharAt = String.class.getMethod("charAt", int.class);
通过调用Method的invoke()函数来让某一对象执行Method对应的方法,参数为要执行的对象和方法所需的参数
methodCharAt.invoke(str1, 1);
如果invoke()函数中表示对象的参数为空,说明Method对应的方法为静态方法
methodCharAt.invoke(null, 1);
数组的反射
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象(此处比较与值无关)。
反射的主要作用-------实现框架