包装类

包装类

介绍

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

  2. 思考:为什么要再提供8种包装类?

    如:

//我们自己定义的一个包装类
public class MyInt {
    private int value;

    public MyInt() {
    }

    public MyInt(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return String.valueOf(value);
    }
}
public class IntegerTest01 {
    public static void main(String[] args) {
        //有没有这种需求,调用dosome()方法时候,需要传递一个数字进去。
        //但是数字属于基本数据类型,而dosome()方法参数的类型是Object。
        //可见doSome()方法无法接受基本数据类型的数字。那么可以传一个数字对应的包装类进去。
        MyInt mi=new MyInt(11);
        dosome(mi);//11
    }

    public static void dosome(Object obj){
        System.out.println(obj);
    }
}
  1. 8种基本数据类型对应的包装类型名是什么?
     基本数据类型          包装类型
 -------------------------------------
     byte                 java.lang.Byte(父类Number)
     short                java.lang.short(父类Number)
     int                  java.lang.Integer(父类Number)
     long                 java.lang.long(父类Number)
     float                java.lang.Float(父类Number)
     double               java.lang.Double(父类Number)
     boolean              java.lang.Boolean(父类Object)
     char                 java.lang.Character(父类Object)

以上八种包装类中,重点以java.lang.Integer为代表进行学习,其他类型类似。

拆箱与装箱

  1. 定义:

    基本数据类型–(转换为)->引用数据类型(装箱)
    将引用数据类型–(转换为)->基本数据类型(拆箱)

    public class IntegerTest02 {
        public static void main(String[] args) {
             //123这个基本数据类型,进行构造方法的包装达到了:基本数据类型向引用数据类型的转换
             //基本数据类型--(转换为)->引用数据类型(装箱)
            //JDK9之后不建议使用
             Integer i=new Integer(123);
             //将引用数据类型--(转换为)->基本数据类型(拆箱)
             float f=i.floatValue();
            System.out.println(f);
    
        }
    }
    
  2. 八种包装类中其中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 形式返回指定的数值。
           //     这些方法其实所有的数字包装类的子类都有,这些方法是负责拆箱的。
    
  3. 自动装箱和自动拆箱(在JDK1.5之后支持自动拆箱和自动装箱):

    有了自动拆箱后,Number类中的方法就用不着了。

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

    public class IntegerTest05 {
        public static void main(String[] args) {
            //自动装箱
            //int类型-自动转换为->Integer
            Integer x=100;
            System.out.println(x);//100
            //Integer类型-自动转换为->int
         //自动拆箱
            int y=x;
         System.out.println(y);//100
    
    
            //z是一个引用,z是一个变量,z还是保存了一个对象的内存地址。
            Integer z=1000;  //等同于:Integer z=new Integer(1000)
            //为什么这个没报错
            //+两边要求是基本类型的数字,z是包装类,不属于基本数据类型。
            //这里会进行自动拆箱,将z转换成基本数据类型
            System.out.println(z+1);//1001
    
    
            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
    
        }
    }
    
  4. 面试题:

    java中为了提高程序的执行效率,将**[-128,127]之间所有的包装对象提前创建好**,放到一个方法区的整数型常量池当中了,目的是只要用这个区间的数据,不需要再new了, 直接从整数型常量池当中取出来。(Integer类加载的时候,会初始化整数型常量池:256个对象)

    原理:x变量保存的对象内存地址和y变量保存的对象内存地址是一样的

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

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Dkp36Kx-1595315108127)(C:\Users\user\Desktop\Integer存储内存分析.png)]

Integer类

  1. 构造方法:

    /*
    * 关于Integer类的构造方法 有两个
    * Integer(int)
    * Integer(String)
    * */
    public class IntegerTest03 {
        public static void main(String[] args) {
            //JDK9之后不建议使用这个构造方法,已过时
            //将数字100转换为Integer包装类型
            Integer x=new Integer(100);
    
            //将String类型的数据转换成Integer包装类型
            Integer y=new Integer("123");
            System.out.println(x);//100
            System.out.println(y);//123
        }
    }
    
  2. 通过访问包装类的常量,来获取最大值和最小值

    public class IntegerTest04 {
        public static void main(String[] args) {
            //通过访问包装类的常量,来获取最大值和最小值
            System.out.println("int的最大值:"+Integer.MAX_VALUE);//int的最大值:2147483647
            System.out.println("int的最小值:"+Integer.MIN_VALUE);//int的最小值:-2147483648
            System.out.println("byte的最大值:"+Byte.MAX_VALUE);//byte的最大值:127
            System.out.println("byte的最小值:"+Byte.MIN_VALUE);//byte的最小值:-128
        }
    }
    
  3. 常用方法

    public class IntegerTest07 {
        public static void main(String[] args) {
            //手动装箱
            Integer x=new Integer(1000);
           //手动拆箱
            int y=x.intValue();
            System.out.println(y);
    
            Integer a=new Integer("123");
            //不是一个"数字"不能包装成Integer类
            //java.lang.NumberFormatException
            //Integer b=new Integer("三");
            System.out.println(a);
    
            //重点方法
            //static int parseInt(String s)
            // 静态方法:传参String,返回int
            //网页上文本输入的100实际上是"100"字符串。后台数据库要求存储100数字
            //此时java程序需要将"100"转换为100数字
            int retValue= Integer.parseInt("123");//String-->int
           // int retValue1= Integer.parseInt("三");//java.lang.NumberFormatException
            System.out.println(retValue);
    
            //类似于parseInt
            double retValue2=Double.parseDouble("3.14");
            System.out.println(retValue2+1);
    
    
            float retValue3=Float.parseFloat("1.8");
            System.out.println(retValue3+1);
            
            //(了解)
            //静态的:将十进制转换为二进制字符串
            String binaryString=Integer.toBinaryString(13);
            System.out.println(binaryString);
    
            //static String toHexString(int i)
            //静态的:将十进制转换为十六进制字符串
            String hexString=Integer.toHexString(26);
            System.out.println(hexString);
    
            //static String toOctalString(int i)
            //静态的:将十进制转换为八进制字符串
            String octalString=Integer.toOctalString(9);
            System.out.println(octalString);
            
            
            
              //valueof方法做了解
            //static Integer valueOf(int i)
            //静态的:int->Integer
            Integer i=Integer.valueOf(1);
            System.out.println(i);
    
            //static Integer valueOf(String s)
            //静态的:String->Integer
            Integer i1=Integer.valueOf("1");
            System.out.println(i1);
    
    
        }
    }
    

String ,int,Integer类型相互转化


public class IntegerTest04 {
    public static void main(String[] args) {
 int i2=1;
        //int->String
        String s=i+"";
        String s1= String.valueOf(i2);
        //String->int
        String s2="111";
        int i3=Integer.parseInt(s2);
       //int->Integer
        Integer i4=i2;
       Integer i5= Integer.valueOf(i2);
        //Integer->int;
        int i6=i4;
        int i7=i4.intValue();
        //String->Integer
        Integer i8=Integer.valueOf("1");
        //Integer->String
        String s3=String.valueOf(i4);
    }
}

如图:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值