JavaSE笔记13:基本类型对应的8个包装类

28 篇文章 0 订阅

基本类型对应的8个包装类

1.8种包装类存在的意义

  1. java中为8种数据类型又对应准备了8种包装类型。8种包装类属于引用数据类型,父类是Object。

  2. 为什么要提供8种包装类呢?

    因为8种基本类型不够用

public class IntegerTest01 {
    public static void main(String[] args) {
        /*假设有需求:调用doSOme()方法的时候需要传一个数字进去,
        但是数字属于基本数据类型,而doSOme方法参数的类型是Object
        可见doSome方法无法接收基本数据类型的数字。怎么办?可以传一个数字对应的包装类进去。
        */
        //把100这个数字经过构造方法包装成对象
        MyInt myInt = new MyInt(100);
        //doSome方法虽然不能直接传100,但是可以传一个100对应的包装类型
        doSome(myInt);
    }
    public static void doSome(Object obj){
        System.out.println(obj);
    }
    //输出结果为:100
}
package se2.integer;

public class MyInt {
    int value;

    public MyInt() {}
    public MyInt(int value) {
        this.value = value;
    }
    //重写toString方法
    @Override
    public String toString() {
        return String.valueOf(value);
    }
}

2.8种基本数据类型对应的包装类型名是什么?

基本数据类型包装类型
bytejava.lang.Byte(父类Number)
shortjava.lang.Short(父类Number)
intjava.lang.Integer(父类Number)
longjava.lang.Long(父类Number)
floatjava.lang.Float(父类Number)
doublejava.lang.Double(父类Number)
booleanjava.lang.Boolean(父类Object)
charjava.lang.Character(父类Object)

以上8种包装类中,重点以java.lang.Integer为代表进行学习,其他的类型照葫芦画瓢就行了

3.装箱和拆箱的概念

Number是一个抽象类,无法实例化对象

Number类中有这样的方法:

byte byteValue()以byte形式返回指定的数值
abstract double doubleValue()以double形式返回指定的数值
abstract float floatValue()以float形式返回指定的数值
abstract int intValue()以int形式返回指定的数值
abstract long longValue()以long形式返回指定的数值
short shortValue()以short形式返回指定的数值

这些方法其实所有的数字包装类的子类都有,这些方法是负责拆箱的。

public class IntegerTest02 {
    public static void main(String[] args) {
        //123这个基本数据类型,进行构造方法的包装达到了:基本数据类型向引用类型的转换
        //基本数据类型(转换)-->引用数据类型(装箱)
        Integer i = new Integer(123);
        //将引用数据类型(转换)-->基本数据类型(拆箱)
        float f = i.floatValue();
        System.out.println(f);//123.0
        //将引用数据类型(转换)-->基本数据类型(拆箱)
        int retValue = i.intValue();
        System.out.println(retValue);//123
    }
}

4.自动装箱与自动拆箱

在JDk1.5(java5)之后,支持自动拆箱和自动装箱了

  1. 自动装箱:基本数据类型自动转换成包装类
  2. 自动拆箱:包装类自动转换成基本数据类型
  3. 有了自动拆箱之后,Number类中的方法就用不着了!

自动装箱和自动拆箱的好处:方便编程

package se2.integer;

public class IntegerTest05 {
    public static void main(String[] args) {
        //900是基本数据类型
        //x是包装类型
        //基本数据类型--(自动转换)-->包装类型:自动装箱
        Integer x = 900;
        System.out.println(x);//900

        //x是包装类型
        //y是基本数据类型
        //包装类型--(自动转换)-->基本数据类型:自动拆箱
        int y = x;
        System.out.println(y);//900

        //z是一个引用,是一个变量,z还是保存了一个对象的内存地址
        Integer z = 1000;//等同于:Integer z = new Integer(1000);
        //分析为什么没有报错呢?
        /**
         * +号两边要求是基本数据类型的数字,z是包装类,
         * 不属于基本数据类型,这里会自动拆箱,将z转换
         * 成基本数据类型
         */
        System.out.println(z + 1);

        Integer a = 1000;//Integer a = new Integer(1000);a是个引用,保存内存地址指向对象
        Integer b = 1000;//Integer b = new Integer(1000);b是个引用,保存内存地址指向对象
        //== 比较的是对象的内存地址,a和b两个引用中保存的对象内存地址不同
        //== 不会触发自动拆箱机制。(只有+-*/等运算的时候才会)
        System.out.println(a == b);//false
    }
}

扩展:

package se2.integer;
/*
这个题目是Integer非常重要的面试题
 */
public class IntegerTest06 {
    public static void main(String[] args) {

        Integer a = 128;
        Integer b = 128;
        System.out.println(a == b);//false
        /**
         * java中为了提高程序的执行效率,将-128到127之间所有的包装对象提前创建好,
         * 放到了一个方法区的“整数型常量池”当中了,目的是只要用这个区间的数据不需要
         * 再new了,直接从整数型常量池当中取出来。
         */
        //原理:x变量中保存的对象的内存地址和y变量中保存的对象的内存地址是一样的
        Integer x = 127;
        Integer y = 127;
        System.out.println(x == y);//true
    }
}

5.Integer的构造方法

关于Integer类的构造方法,有两个:

​ Integer(int)

​ Integer(String)

package se2.integer;

public class IntegerTest03 {
    public static void main(String[] args) {
        //java9之后不建议使用这个构造方法了
        //将数字100转换成Integer包装类型(int -->Integer)
        Integer x = new Integer(100);
        System.out.println(x);//100

        //将String类型的数字,转换成Integer包装类型(String -->Integer)
        Integer y = new Integer("123");
        System.out.println(y);//123

        //double --> Double
        Double d = new Double(1.23);
        System.out.println(d);//1.23
        //String --> DOuble
        Double e = new Double("3.14");
        System.out.println(e);//3.14
    }
}

通过访问包装类的常量,来获取最大值和最小值,如下

package se2.integer;

public class IntegerTest04 {
    public static void main(String[] args) {
        
        System.out.println("int的最大值:" + Integer.MAX_VALUE);
        System.out.println("int的最小值:" + Integer.MIN_VALUE);
        System.out.println("byte的最大值:" + Byte.MAX_VALUE);
        System.out.println("byte的最小值:" + Byte.MIN_VALUE);
        /**输出结果:
         * int的最大值:2147483647
         * int的最小值:-2147483648
         * byte的最大值:127
         * byte的最小值:-128
         */
    }
}

6.Integer的常用方法

package se2.integer;

public class IntegerTest07 {
    public static void main(String[] args) {
        //1手动装箱与自动装箱
        //手动装箱
        Integer x = new Integer(1000);
        //手动拆箱
        Integer y = x.intValue();
        System.out.println(y);//1000

        Integer a1 = new Integer("123");
        //编译的时候没问题,运行时呢?
        //不是一个数字可以包装成Interger吗?不能!运行时会出现异常!
        //java.lang.NumberFormatException(数字格式化异常)
        //Integer a2 = new Integer("阿波");

        //2重点方法
        //static int parseInt(String s)
        //静态方法,传参String,返回int
        /**
         * 为什么常用这个方法?原因如下
         * 网页上文本框中输入的100实际上是“100”字符串,后台数据库中
         * 要求存储100数字,此时java程序需要将“100”转换成100数字。
         */
        int retValue = Integer.parseInt("123");//String -转换->int
        System.out.println(retValue + 110);//233
        /*
        int retValue2 = Integer.parseInt("阿波");
        System.out.println(retValue2 + 100);
        //报错:java.lang.NumberFormatException: For input string: "阿波"
        */
        //照葫芦画瓢
        double retValue3 = Double.parseDouble("3.14");
        System.out.println(retValue3 + 1);//4.140000000000001(精度问题)

        float retValue4 = Float.parseFloat("1.0");
        System.out.println(retValue4 + 1);//2.0

        //以下内容作为了解,不需要掌握
        /**
         * static String toBinaryString(int i)
         * 静态的:将十进制转换成二进制字符串
         */
        String binaryString = Integer.toBinaryString(3);
        System.out.println(binaryString);//11(二进制字符串)

        /**
         * static String toHexString(int i)
         * 静态的:将十进制转换成十六进制的字符串
         */
        //十六进制:1 2 3 4 5 6 7 8 9 a b c d e f  10 11 12 13 14 15 16 17 18 19 1a...
        String hexString1 = Integer.toHexString(16);
        System.out.println(hexString1);//10

        String hexString2 = Integer.toHexString(17);
        System.out.println(hexString2);//11
        /**
         * static String toOctalString(int i)
         * 静态的:将十进制转换成八进制字符串
         */
        String octalString = Integer.toOctalString(8);
        System.out.println(octalString);//10

        /**
         * valueOf方法作为了解
         * static Integer valueOf(int i)
         * 静态的:int --> Integer
         */
        Integer i1 = Integer.valueOf(100);
        System.out.println(i1);//100

        /** static Integer valueOf(String s)
         * 静态的:String --> Integer
         */
        Integer i2 = Integer.valueOf("100");
        System.out.println(i2);//100
    }
}

7.String、int、Integer之间互相转换

package se2.integer;

public class IntegerTest08 {
    public static void main(String[] args) {
        //String --> int
        String s1 = "100";
        int i1 = Integer.parseInt(s1);
        System.out.println(i1 + 1);//101

        //int --> String
        String s2 = i1 + "";//i1还是100字符串
        System.out.println(s2 + 1);//1001

        //int --> Integer
        //自动装箱
        Integer x = 1000;

        //Integer --> int
        //自动拆箱
        int y = x;

        //String --> Integer
        Integer a = Integer.valueOf("123");

        //Integer --> String
        String b = String.valueOf(a);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值