包装类 Integer 详解.

代码演示(手动):

package com.bjpowernode.javase.integer;

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

 */
public class IntegerTest01 {

    // 程序入口
    public static void main(String[] args) {
        // 有没有这种需求:调用doSome()方法的时候需要传一个数字进去
        // 但是数字属于基本数据类型,而doSome()方法参数的类型是Object引用数据类型
        // 可见doSome()方法无法接收基本数据类型的数字    那怎么办呢?可以传一个数字对应的包装类进去
        // 把100这个数字经过构造方法包装成对象
        MyInt myInt =new MyInt(100);    // MyInt 为包装类
        doSome(myInt);  // 将 new MyInt(100); 传入doSome方法
    }

    // doSome方法
    public static void doSome(Object obj){ // Object obj =new MyInt(100);   // 多态
        // System.out.println(obj);    // com.bjpowernode.javase.integer.MyInt@1b6d3586
        // 输出结果表明:MyInt类没有重写父类Object的toString方法
        System.out.println(obj);    // 100    输出引用自动调用toString方法
    }
}

我们手动包装的类:(SUN公司其实帮我们写好了包装类 我们只需要调用即可)

package com.bjpowernode.javase.integer;

//  这种包装类目前是咱们自己写的,实际开发种我们不需要自己写
public class MyInt {
    int value;

    public MyInt() {
    }

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

    @Override
    public String toString() {
        return String.valueOf(value);   // 将非字符串转换成字符串
    }
}

一、八种包装类都是什么?

 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为代表学习,其他的类型照葫芦画瓢即可

代码演示: 

public class IntegerTest02 {
    public static void main(String[] args) {
        // 100 这个基本数据类型,进行构造方法的包装达到了:基本数据类型向引用数据类型的转换
        Integer i=new Integer(100);    
        doSome(i);    // i 引用数据类型
    }
    public static void doSome(Object obj){
        System.out.println(obj);    // 100
    }
}

二、装箱和拆箱

3、八种包装类其中6个都是数字对应的包装类,他们的父类都是Number,可以先研究以下Number中公共的方法:
        Number是一个抽象类,无法实例化对象
        Number类中有这样的方法:
            // 以int形式返回指定的数值
           1、 public abstract int intValue()
           2、 public abstract long longValue()
           3、public abstract float floatValue()
           4、 public abstract double doubleValue()
           5、 public byte byteValue()
           6、 public short shortValue()
           以上这些方法是负责拆箱的

代码演示如下: 

public class IntegerTest02 {
    public static void main(String[] args) {
        // 100这个基本数据类型,进行构造方法的包装达到了:基本数据类型向引用数据类型的转换
        // 将基本数据类型(100)----(转换)----->引用数据类型(i)  【装箱】
        Integer i=new Integer(100);

        // 因为Integer默认继承父类Number、Number类是一个抽象类 里面也有很多(拆箱)的方法 如:public abstract int intValue()
        // 将引用数据类型----(转换)-----> 基本数据类型
        float a =i.floatValue();    // 非抽象类子类必须重写父类的抽象方法(能调用输出结果 说明子类Integer重写了父类的floatValue方法)
        System.out.println(a);  // 100.0

        // 将引用数据类型----(转换)----->基本数据类型  【拆箱】
        int a1 =i.intValue();
        System.out.println(a1); // 100
    }
}

三、自动装箱、拆箱[记住这个即可]

package com.bjpowernode.javase.integer;

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

        // a是包装类型
        // b是基本数据类型
        // 包装类型----(自动转换)-----> 基本数据类型    【自动拆箱】
        int b=a.intValue();
        System.out.println(b);  // 900

        // 分析以下代码为什么没报错呢?
        // +两边要求是基本数据类型的数字,z是包装类,不属于基本数据类型,这里会进行自动拆箱。将z转换成基本数据类型
        // z是一个引用,z还是保存了一个对象的内存地址 还相当于 Integer z =new Integer(1000);
        Integer z =1000;
        System.out.println(z+1);    // 1001     说明z进行了自动拆箱(自动拆箱机制)


        Integer x =5000;    //x是一个引用,x还是保存了一个对象的内存地址 还相当于 Integer x =new Integer(1000);
        Integer y =5000;
        // "=="比较的是对象的内存地址
        // 这里不会触发自动拆箱机制(把x、y拆箱成5000 不会的) 只有+ - * / 等才会触发自动拆箱机制
        System.out.println(x==y);   // false
    }
}

 思考以下代码:

package com.bjpowernode.javase.integer;

public class IntegerTest04 {
    public static void main(String[] args) {

        Integer a =128; // 因为这里相当于 Integer a =new Integer(128); 还是需要new对象
        Integer b =128;
        System.out.println(a==b);   // false    两个对象内存地址不同 所以false


       // 分析下列的c==d为什么就true了呢?
        /*
        java中为了提高程序的执行效率,将[-128~127]之间所有的包装对象提前创建好,
        放到了一个方法区的"整数常量池"当中了,目的是只要用这个区间的数据不需要再
        new Integer对象了,直接从整数型常量池当中取出来
         */

        Integer c =127;
        Integer d =127;
        System.out.println(c==d);   // true
    }
}

内存图演示: 

四、Integer类当中的常用方法

package com.bjpowernode.javase.integer;

public class IntegerTest05 {

    public static void main(String[] args) {

        // 手动装箱
        // 基本数据类型>>>包装类型
        Integer a =new Integer(1000);

        // 手动拆箱
        // 包装类型>>>基本数据类型
        int b =a.intValue();
        System.out.println(b);  // 1000

        Integer c =new Integer("90");
        System.out.println(c);  // 90

        // Integer d =new Integer("中文");
        // System.out.println(d);  // 报错:NumberFormatException异常

        // 得出结论:基本数据类型可以传整数型、字符串型(但字符串型必须是数字).....
    }
}

 重点方法:!!!!!【以后做项目用的到】

package com.bjpowernode.javase.integer;

import javafx.beans.binding.DoubleExpression;

public class IntegerTest05 {

    public static void main(String[] args) {

        // Integer当中的重点方法: public static int parseInt(String s)
        // 静态方法 返回值为int 传参String类型
        //用处: 以后做项目,在网页上文本框中输入100实际上是”100“字符串,后台数据库中要求储存100数字,
        // 此时java程序需要将”100“转换成100,需要用到此方法 【网页上输入个100 其实输入的100是字符串类型】
        int s =Integer.parseInt("986");
        System.out.println(s);  // 986

        // 记住不能输中文字符串
        // int a =Integer.parseInt("中文");  // 异常:NumberFormatException
        

        // 比葫芦画瓢
        double s1 = Double.parseDouble("3.14");
        System.out.println(s1); // 3.14

    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值