【黑马程序员】张孝祥Java高新技术_装箱拆箱、枚举、反射

 ---------------------- 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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值