---------------------- android培训、java培训、期待与您交流! ----------------------
基本数据类型的自动装箱与拆箱
自动装箱:
Integer num1 = 12; (不用new)
自动拆箱:
System.out.println(num1 + 12); (Integer不支持加法,但自动转换成了基本类型整数)
基本数据类型的对象缓存:
Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2); (true)
Integer num3 = 129;
Integer num4 = 129;
System.out.println(num3 == num4); (false)
Integer num5 = Integer.valueOf(12);
Integer num6 = Integer.valueOf(12);
System.out.println(num5 == num6); (true)
基本类型的整数装箱成Integer对象的时候,如果数字在一个字节之内(-128~127),那么就把它缓存在缓存池里面,下次在装箱时会从缓存池里面找是否有这样的对象(比较小,不怎么改变),如果有就直接拿来用。这是一种设计模式:享元模式。
享元模式(flyweight):如果很多很小的对象,他们有很多属性相同,把相同的属性变成一个对象,把那些不同的属性变成方法的参数,称之为外部状态,那些相同的属性称之为内部状态。
枚举类
1.在枚举元素的后面跟上一对圆括号,就表示创建这个元素指向的实例对象的时候,调用的哪个构造方法。
2.枚举类的构造方法必须为私有。
3.在枚举元素的后面跟上一对大括号,就表示这个元素是这个枚举类的子类实现的。
4.枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后面要有分号与其他成员分隔。
5.枚举只有一个成员时,就可以作为一种单例的实现方式。
反射
7.Class.forName的作用是返回类的字节码,一种是曾经被加载过就直接找到返回,一种是还没被加载过那么就用类加载器去加载,之后将字节码缓存起来,然后返回此字节码。
8.得到各个字节码对应的实例对象(Class类型)
(1)类名.class,例如,System.class
(2)对象.getClass(),例如,new Date().getClass()
(3)Class.forName(“类名”),例如, Class.forName(“java.util.Date”);
9.Integer.TYPE表示的是它所包装的基本类型的字节码,也就相当于int.class
10.数组类型的Class实例对象:Class.isArray()
11.反射就是把java类中的各种成分映射成相应的java类。
12.Constructor类代表某个类中的一个构造方法
13.得到某个类所有的构造方法:
Constructor[] constructor = Class.forName(“java.lang.String”).getConstructors();
14.得到某一个构造方法:
Constructor constructor=Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
15.创建实例对象:
通常方式:String str = new String(new StringBuffer(“abc”));
反射方式:String str = (String) constructor .newInstance( new StringBuffer(“abc”));
16.Class.newInstance()方法:内部先得到默认的构造方法,然后用该构造方法创建实例对象。
17.Field类代表某个类中的一个成员变量。它代表的是成员变量的定义,而不是具体的变量。
18.成员变量反射的实例:将一个对象中的所有String类型的成员变量所对应的字符串内容中的“b”改为“a”。
package cn.xy.day1;
import java.lang.reflect.Field;
public class ReflectPoint {
private int x;
public int y;
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(){
return str1 + ":" + str2 + ":" + str3;
}
public static void main(String arg[]) throws Exception{
ReflectPoint rp = new ReflectPoint(2,3);
Field[] fields = rp.getClass().getFields();
for(Field field : fields){
//共用一份字节码,所以用==
if(field.getType() == String.class){
String oldValue = (String)field.get(rp);
String newValue = oldValue.replace('b', 'a');
field.set(rp, newValue);
}
}
System.out.println(rp.toString());
}
}
19.Method类代表某个类的一个成员方法
20.得到类中的某一个方法:
Method charAt = Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);
21.调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式:System.out.println(charAt.invoke(str,1));
如果传递给Method对象的invoke()方法的一个参数为null,说明该Method对象对应的是一个静态方法!
22.用反射方式执行某个类中的main方法:
package cn.xy.day1;
import java.lang.reflect.Method;
public class TestArgument {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
String strName = args[0]; //这里设置args[0]=cn.xy.day1.startMain
Method mainMethod = Class.forName(strName).getMethod("main",String[].class);
mainMethod.invoke(null, new Object[]{new String[]{"11","22","33"}});
}
}
class startMain{
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(args[0]+args[1]+args[2]);
}
}
23.数组反射的应用:
package cn.xy.day1;
import java.lang.reflect.Array;
public class TestArgument {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Object obj = null;
int objInt = 5;
printObject(objInt);
int[] objIntArray = {5,4,3,2,1};
printObject(objIntArray);
}
private static void printObject(Object obj) {
// TODO Auto-generated method stub
Class clazz = obj.getClass();
if(clazz.isArray()){
int len = Array.getLength(obj);
for(int i=0;i<len;i++){
System.out.println(Array.get(obj, i));
}
}else{
System.out.println(obj);
}
}
}
24.hashSet是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域。Object类中定义了一个hashCode()方法来返回每个java对象的哈希码,当从hashSet集合中查找某个对象时。Java系统首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希码找到相应的存储区域,最后取出该存储区域内的每个元素与该对象进行equals方法比较,这样不用遍历集合中的所有元素就可以得到结论。
如果两个实例对象的equals方法比较结果相等,那么他们的哈希码也必须相等。反之不成立。
只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法,即使程序可能暂时不会用到当前类的hashCode方法,但是为它提供一个hashCode方法也不会有什么不好,没准以后什么时候又用到这个方法了,所以通常要求hashCode方法和equals方法一并被同时覆盖。
当一个对象被存储进hashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进hashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去hashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从hashSet集合中单独删除当前对象,从而造成内存泄露。
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima