---------------------- android培训、java培训、期待与您交流! ----------------------
对于基本数据类型的整数,若-128—127之间,包装成Integer对象之后,便放在缓冲池中!
享元模式(flyweight):当很多很小的对象,使用的频率较高,又有很多东西一样,则可以把他们变成一个对象,把外部属性作为方法的参数,称之为外部的状态!
枚举:枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错,枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方法在开发阶段无法实现这一目标。
定义枚举类的关键字:enum
对象方法:.name(获取名字),.ordinal(获取对象的位置)
静态方法:.valueOf(将其封装成对象),.values(将类中对象封装到数组里)
实现带有构造方法的枚举:1、元素列表必须放在最前面
2、构造函数必须private
3、在枚举元素的后面加上(),可以确定使用哪个构造函数
实现带有抽象方法的枚举:
例子:实现一个交通灯的枚举:
作用:可以获取到下一个灯,能够设定灯切换的时间;
publicenum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
returnGREEN;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
returnRED;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
returnYELLOW;
}
};
private TrafficLamp(){};
private TrafficLamp(int time){};
publicabstract TrafficLamp nextLamp();
}
枚举只有一个成员时,可以作为一种单例的实现方式~!
反射(java高新技术17开始—25):【Constructor、Field、Method、Package】
反射的基石(Class类—java.Lang.Class)
如何得到各个字节码对应的实例对象:
1、 类名.class,例如:System.class
2、 对象.getClass(),例如:new Date().getClass()
3、 Class.forName(“类名”),例如:Class.forName(“java.util.date”);
九个预定义Class实例对象:
参看Class.isPrimitive方法的帮助
int.class==Integer.TYPE(true)
数组类型的Class实例对象:Class.isArray()
总之,只要在源程序中出现的类型,都有各自的Class实例对象,例如:int[] ,void……
反射就是把java类中的各种成分映射成相应的java类。
得到某个类所有的构造方法:
例子:
Constructor【】constructors=Class.forName(“java.lang.String”).getConstructors;
得到某一个构造方法:
例子:Constructor constructor=
Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);//获得方法时要用到类型
创建实例对象:
通常方式:String str=new String(new StringBuffer(“abc”));
反射方式:String str=(String)constructor.newInstance(new StringBuffer(“abc”));//调用获得的方法时要用到上面相同类型额实例对象。
Class.newInstance()方法:
例子:String obj=(String)Class.forName(“java.lang.String”).newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象
该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。
Field类:
Field类代表某个类中的一个成员变量
fieldX代表的是x的定义,而不是具体的x变量;
例子:
定义类:
publicclass ReflectPoint {
privateintx;
publicinty;
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
使用反射:
ReflectPoint fp1=new ReflectPoint(3,5);
Field fieldY=fp1.getClass().getField("y");//访问公有成员变量
System.out.println(fieldY.get(fp1));
Field fieldX=fp1.getClass().getDeclaredField("x");
//访问私有成员变量
fieldX.setAccessible(true);//暴力反射—使私有变量可访问!
System.out.println(fieldX.get(fp1));
成员变量反射的综合案例!
1、publicclass ReflectPoint {
privateintx;
publicinty;
public String str1="ball";
public String str2="basketball";
public String str3="itcast";
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
public String toString(){
returnstr1+":"+str2+":"+str3;
}
}
2、privatestaticvoid changStringValue(Object obj) throws IllegalArgumentException, IllegalAccessException {
// TODO Auto-generated method stub
Field[] fields=obj.getClass().getFields();
for(Field field:fields){
if(field.getType()==String.class){
String oldValue=(String)field.get(obj);
String newValue=oldValue.replace('b', 'a');
field.set(obj, newValue);
}
}
}
Method类:
Method类代表某个类中的一个成员方法:
例子:Method charAt=Class.forName(“java.lang.String”).getMothod(“charAt”,int.class);
调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式:System.out.println(charAt.invoke(str,1));如果传递给Method对象的invoke()方法的第一个参数为null,说明该Method对象对应的是一个静态方法!
---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima