包装类型及自动装箱拆箱机制

java为8种基本类型又对应准备了8种包装类型,8种包装类型属于引用类型,父类是object类

8种基本数据类型对应的包装类型名是什么?
 * 8种基本数据类型对应的包装类型名是什么?
 *      基本数据类型      包装类型
 * ---------------------------------
 *      byte            java.lang.Byte
 *      short           java.lang.short
 *      int             java.lang.Integer
 *      long            java.lang.Long
 *      float           java.lang.Long
 *      double          java.lang.Double
 *      boolean         java.lang.Boolean
 *      char            java.lang.Character

8种包装类型都是引用类型,重点以java.lang.Integer为代表进行学习,其它的照葫芦画瓢就完事了!8种包装类型中其中6个都是数字对应的包装类,他们的父类都是Number,可以先研究Number中的公共方法:

*       Number是一个抽象类,无法实例化对象.
 *      Number类中有这些方法,这些方法是负责拆箱的:
 * byte byteValue()返回指定号码作为值 byte ,这可能涉及舍入或截断。
 * abstract double doubleValue()
 * 返回指定数字的值为 double ,可能涉及四舍五入。
 * abstract float floatValue()
 * 返回指定数字的值为 float ,可能涉及四舍五入。
 * abstract int intValue()
 * 返回指定号码作为值 int ,这可能涉及舍入或截断。
 * abstract long longValue()
 * 返回指定数字的值为 long ,可能涉及四舍五入或截断。
 * short shortValue()
 * 返回指定号码作为值 short ,这可能涉及舍入或截断。
 *  * eg:  Integer的构造方法,有两个:
 *      Integer(int)
 *      Integer(String)
 *      其它引用类型的构造方法类似
这种需求: 调用doSome()方法的时候需要传一个数字进去,但是数字属于基本数据类型,而doSome()方法的参数类型是Object类型

怎么办?传一个数字对应的包装类进去:
代码

public static void main(String[] args) {
        // 有没有这种需求: 调用doSome()方法的时候需要传一个数字进去。
        // 但是数字属于基本数据类型,而doSome()方法的参数的类型是Object
        // 可见doSome()方法无法接收基本数据类型的数字。那怎么办? 可以传一个数字对应的包装类进去.
        MyInt myInt = new MyInt(100);
        doSome(myInt);
        //======================================================================
        // 123这个基本数据类型,进行和构造的包装达到了: 基本数据类型向引用数据类型的转换
        // 基本数据类型 --> 转换成引用数据类型 (装箱)
        Integer integer = new Integer(123);
        // 将引用数据类型转换为  基本数据类型 (拆箱)
        float f = integer.floatValue();
        System.out.println(f);
        // 将引用数据类型转换为  基本数据类型
        int retValue = integer.intValue();
        System.out.println(retValue);
    }

    public static void doSome(Object obj){
        System.out.println(obj);
    }
}

运行结果:

MyInt{value=100}
123.0
123
自动装箱和自动拆箱(JDK5之后引入)

自动装箱:基本数据类型自动转换成包装类型
自动拆箱:包装类型自动转换成基本数据类型
有了自动拆箱以后,Number类中的方法就不用看了,好处:方便编程!
example:

        // 900是基本数据类型 x是包装类型 基本数据类型(自动转换)--> 包装类型 (自动装箱)
        Integer i = 900;
        System.out.println(i);
        // x是包装类型 j是基本数据类型  包装类型 --(自动转换)--> 基本数据类型 (自动拆箱)
        int j = i;
        System.out.println(j);
        // z是一个引用,z是一个变量,z还是保存了一个对象的内存地址.
        Integer z = 1000; // 等同于: Integer z = new Integer(1000)
        // 为什么这个没有报错? 自动将z(包装类)转换为基本数据类型  自动拆箱
        System.out.println(z + 1);
        Integer a = 1000;
        Integer b = 1000;
        // == 比较的是对象的内存地址,a和b两个引用中保存的对象内存地址不同
        // == 这个运算符不会触发自动拆箱机制,只有+ - * / 等运算的时候才会
        System.out.println(a==b); // false
900
900
1001
false
判断下面代码的执行结果:

代码

        Integer a = 128;
        Integer b = 128;
        System.out.println(a==b); // false
        Integer x = 127;
        Integer y = 127;
        System.out.println(x==y);// true
        

运行结果:

false
true

上述例子是Integer非常重要的面试题.java中为了提高程序的执行效率,将-128到127之间的所有包装类型提前创建好,放到一个方法区的"整型常量池"当中了。目的是只要用这个区间的数据就不需要new了,直接从整型常量池中取出来。

重点方法:parse方法可以把字符串转换成基本的类

方法:static int parseInt(String s)
该方法常用且是重点方法的原因是在网页文本框中输入的100实际上是"100"字符串,而后台数据库中要求存储100数字,此时java程序需要将"100"字符串转换成100数字.
example:

 	int retValue = Integer.parseInt("123"); 				  
        System.out.println(retValue+100);
        // 照葫芦画瓢
        double s = Double.parseDouble("3.14");
        System.out.println(s);

运行结果:

223
3.14

如果是下面代码呢?

int retValue = Integer.parseInt("中文");

编译的时候没问题,一切符合java语法。运行时会出现问题,报:

java.lang.NumberFormatException

会出现数字格式化异常!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹤林村菠萝皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值