zoukankan      html  css  js  c++  java
  • Java学习笔记 -八种包装类

    包装类存在的意义

    • 前几天的作业stack中:void push(Object s);
    • 调用:push(100),将基本类型传递给了Object,
    • 理论上这种语法显然是不对的,基本类型无法传递给引用数据类型
    • 实际上,java将100先“包装“成包装类(自动装箱和拆箱),才能实现参数传递的

    示例(自己写的包装类):

    package com.javase.integer;
    //示例:包装类存在的意义:
    public class integerTest01 {
        public static void doSome(Object obj){
            System.out.println(obj);
        }
        public static void main(String[] args) {
            MyInt m = new MyInt(100);
            doSome(m);
        }
    }
    
    //自己模拟包装类
    class MyInt{
        int value;
    
        public MyInt() {
        }
        public MyInt(int value) {
            this.value = value;
        }
    
        @Override
        public String toString() {
            return "MyInt{" +
                    "value=" + value +
                    '}';
        }
    }
    

    java中的八种包装类

    • 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.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) {
            //基本数据类型向引用数据类型转换(手动装箱)
            Integer i = new Integer(123333);
    
            //引用数据类型向基本数据类型转换(手动拆箱)
            float f = i.floatValue();
            System.out.println(f);
            int retValue = i.intValue();
            System.out.println(retValue);
            //byte类型的范围:-128~127,所以这里数据会表示错误
            byte v = i.byteValue();
            System.out.println(v);
    
            //使用类名.的方法访问包装类中的常量
            System.out.println("int的最大值: " + Integer.MAX_VALUE);
            System.out.println("int的最大值: " + Integer.MIN_VALUE);
            System.out.println("Byte的最大值: " + Byte.MAX_VALUE);
        }
    }
    

    自动拆箱&自动装箱

    • 为了方便包装类的使用,所以有了自动拆箱和自动装箱
    • 自动装箱:调用valueOf方法
    • 自动拆箱:调用intValue...方法

    示例:

    public class integerTest04 {
        public static void main(String[] args) {
            //自动装箱(常用)
            Integer a = 1000;
            Integer b = 1000;
            Integer x = 127;
            Integer y = 127;
            //自动拆箱
            int value = x;
    
            //==比较还是对象的内存地址,不会触发自动拆箱
            System.out.println(a == b);          //false
            //java为了提高执行效率,将(-128~127)之间的所有对象都提前创建好,放到方法区“整数型常量池”
            //所以这个区间不需要new对象了,之间从常量池中取出来就行了
            //常量池在类加载时创建:使用静态代码块: static final Integer cache[]
            //缓存机制:节约对象创建的时间
            System.out.println(x == y);        //true
            //但是使用了 + 运算符之后,就会触发自动拆箱,从而转换为基本数据类型进行比较
            System.out.println(a + x == b + y);   //true
        }
    }
    

    内存图如下:

    包装类的常用方法

    public class integerTest03 {
        public static void main(String[] args) {
            //构造方法:Integer(int) or   Integer(String)
            Integer i1 = new Integer(123);
            Integer i2 = new Integer("123");
    
            //将非数字的字符串转换成Integer会抛出异常
            //数字格式化异常:java.lang.NumberFormatException
            Integer a = new Integer("中文");
            System.out.println(a);
    
            //重要方法:parseInt...
            //static int parseInt(String s)
            //功能:将字符串转换成数值
            int retValue = Integer.parseInt("12333");
            double retValue2 = Double.parseDouble("3.11");
    
            System.out.println(retValue + retValue2);
    
            //其他方法:toBinaryString
            //public static String toBinaryString(int i)
            //功能:十进制转换成二进制字符串
            //类似的转换成其他进制,看参考手册
            System.out.println(Integer.toBinaryString(3));
    
            //valueOf方法作为了解
            //static Integer valueOf(int i)
            //功能:将int 转化为Integer,有自动装箱,所以几乎不用。
            Integer i3 = Integer.valueOf(100);
            Integer i4 = Integer.valueOf("100");
            System.out.println(i3);
        }
    }
    

    String Integer int 三种类型间的转换

    示例程序:

    public class integerTest03 {
        public static void main(String[] args) {
            //(十分重要)String -> int
            int retValue = Integer.parseInt("123");
    
            //int -> String
            String s = String.valueOf(123);
    
            //int -> Integer
            Integer i = 123;  //自动装箱
            Integer i2 = Integer.valueOf(123);
    
            //Integer -> int
            int i3 = i;     //自动拆箱
            int i4 = i.intValue();
    
            //Integer -> String
            String s2 = String.valueOf(i);
    
            //String -> Integer
            Integer i5 = new Integer("123");
            Integer i6 = Integer.valueOf("123");
    
        }
    }
    

    图示

  • 相关阅读:
    java之集合Collection详解之3
    委托的高级使用
    委托的一般使用
    泛型(Generic)委托
    泛型(Generic)方法(函数,算法)
    泛型(Generic)接口
    泛型(Generic)类的使用原因和使用方式
    C#反射从入门到放弃(这部分遇到的新东西太多了让人接受不能)
    反射应用——依赖注入
    接口的显式实现
  • 原文地址:https://www.cnblogs.com/zy200128/p/12889996.html
Copyright © 2011-2022 走看看