在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类。

在 Java 中有八个基本类型:byte,short,int,long,float,double,char,boolean,是以值的形式存在的,所以他们并没有面向对象的特征,自然也不继承自 Object,所以不能使用多台,用 Object 的角度去接受基本类型。

假设现在我们有一个计算 1+1 的值,代码如下:

 public class Main {
public static void main(String[] args) {
int i = 1 + 1;
System.out.println(i); // Integer integer1 = new Integer(1);
Integer integer2 = new Integer(1);
int integer = integer1.intValue() + integer2.intValue();
System.out.println(integer); // }
} class Integer {
private int i; public Integer(int i) {
this.i = i;
} public int intValue() {
return i;
}
}

在上面的代码中,如果我们想要计算出 1+1 的值,按照之前所学的我们直接利用 int 类型数据 1+1 即可获取,但是我们在上面说了基本类型并不具备面向对象特征,那我们在某些情况下又需要怎么办呢,这就是上面代码中我们自己所写的 integer 类,但是如果我们仅仅是为了计算一个 1+1 ,每次都需要实例化一些 Integer 又太小题大做了。

所以 Java 就很贴心的为八个基本类型封装了一下,并且内置在了 lang 包内,即包装类,所以我们的代码如下也是可以正常运行的:

 public class Main {
public static void main(String[] args) {
int i = 1 + 1;
System.out.println(i); // Integer integer1 = new Integer(1);
Integer integer2 = new Integer(1);
int integer = integer1.intValue() + integer2.intValue();
System.out.println(integer); //
}
}

包装类是不可变类,在构造了包装类对象后,不允许更改包装在其中的值,包装类是 final 的,不能定义他们的子类。

在上面的图片中,我们可以看出,数字类型的包装类继承自 Number,char 和 boolean 类型的包装类继承自 Object,接下来我们就举例看一下,如下代码:

 /**
* 数字类型的包装类继承自 Number
* 其提供了入:intValue,doubleValue 这样的方法,
* 其作用是将当前包装类表示的数字以其他数字类型的形式返回
* */
public class Main {
public static void main(String[] args) {
/**
* 将基本类型转换成包装类有两种方法:
* 1、调用构造方法
* 2、调用静态方法 valueOf(推荐)
* */
Integer integer1 = new Integer(1);
Integer integer2 = new Integer(1);
System.out.println(integer1 == integer2); // false
System.out.println(integer1.equals(integer2)); // true Integer integer3 = Integer.valueOf(1);
Integer integer4 = Integer.valueOf(1);
System.out.println(integer3 == integer4); // true
System.out.println(integer3.equals(integer4)); // true Integer integer5 = Integer.valueOf(128);
Integer integer6 = Integer.valueOf(128);
System.out.println(integer5 == integer6); // false
System.out.println(integer5.equals(integer6)); // true
}
}

在上面的代码中,我们先使用实例化的方法,结果跟之前文章所讲的 equals 方法时所得的结果一样,当我们使用 valueOf() 方法时,发现 == 也变为了 true,这是因为 valueOf 会重用对象,并不会重新分配地址,但是仅限于 -128 -- 127 之间的整数。一旦超过会去 new 一个新对象。相比较而言,在 -128 -- 127 之间时,valueOf 会帮我们节省一部分内存空间,所以推荐使用 valueOf。

当然包装类也为我们提供了转为基本类型的方法,如下:

 public class Main {
public static void main(String[] args) {
Integer integer = Integer.valueOf(128); int int1 = integer.intValue();
System.out.println(int1); // float float1 = integer.floatValue();
System.out.println(float1); // 128.0 // byte 类型为 -128 -- 127,超出会重新计算
byte byte1 = integer.byteValue();
System.out.println(byte1); // -128
}
}

那我们怎么知道各个基本类型的最大值和最小值呢?包装类其实已经很贴心的为我们提供了方法,如下:

 /**
* 数字类型包装类都支持两个常量
* MAX_VALUE , MIN_VALUE
* 分别保存了对应基本类型的最大值和最小值
* */
public class Main {
public static void main(String[] args) {
int intMax = Integer.MAX_VALUE;
int intMin = Integer.MIN_VALUE;
System.out.println(intMax); //
System.out.println(intMin); // -2147483648 byte byteMax = Byte.MAX_VALUE;
byte byteMin = Byte.MIN_VALUE;
System.out.println(byteMax); //
System.out.println(byteMin); // -128
}
}

通过上面的代码我们了解了包装类的一些基本特征和使用方法,那我们使用包装类的常用方法时什么呢?如下:

 /**
* 包装类提供了一个静态方法 parseXXX(String str)
* 可以将给定的字符串转换为对应的基本类型
* 前提是该字符串必须正确的描述基本类型可以保存的值
*/
public class Main {
public static void main(String[] args) {
String str = "123";
int i = Integer.parseInt(str);
System.out.println(i); // double d = Double.parseDouble(str);
System.out.println(d); // 123.0 float f = Float.parseFloat(str);
System.out.println(f); // 123.0 String str1 = "123.123";
int i1 = Integer.parseInt(str1);
System.out.println(i1); // 编译错误,Integer 并不能识别小数位 double d1 = Double.parseDouble(str1);
System.out.println(d1); // 123.123
}
}

在上面的代码中,我们分别定义了 "123" 和 "123.123" 两个字符串,从上面的输出结果可以看出,只有字符串能正确额描述基本类型可以保存的值才能运行成功。

接下来我们再来看一个包装类的自动拆装箱

 /**
* JDK1.5 以后推出的新特性
* 自动拆装箱
*/
public class Main {
public static void main(String[] args) {
/**
* 自动拆装箱是编译器认可,而不是虚拟机认可
* 编译器在将源程序编译时自动补充代码来完成基本类型与包装类的转换
* */
int i = new Integer(1); // 编译器会默认在后面加 .intValue()
Integer ii = 123; // 编译器会默认变为 Integer.valueOf(123)
}
}

在上面的代码中,我们可以看到 int 类型可以直接接受一个是实例化的包装类,包装类也可以直接接受一个基本类型的值,这就是自动拆装箱,避免了我们在编写程序时的转换,减少了代码量。

Java 从入门到进阶之路(十九)的更多相关文章

  1. Java 从入门到进阶之路(九)

    之前的文章我们介绍了一下 Java 中的构造方法,接下来我们再来看一下 Java 中的引用型数组类型. 现在我们想定义一个坐标系,然后通过横坐标(row)和纵坐标(col)来确定一个坐标点,代码如下: ...

  2. Java 从入门到进阶之路(十)

    之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承. 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继 ...

  3. Java 从入门到进阶之路(十二)

    在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...

  4. Java 从入门到进阶之路(十五)

    在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...

  5. Java 从入门到进阶之路(十四)

    在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...

  6. Java 从入门到进阶之路(十六)

    在之前的文章我们介绍了一下 Java 中类的多态,本章我们来看一下 Java 中类的内部类. 在 Java 中,内部类分为成员内部类和匿名内部类. 我们先来看一下成员内部类: 1.类中套类,外面的叫外 ...

  7. Java 从入门到进阶之路(二十)

    在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...

  8. Java 从入门到进阶之路(二十二)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator. 当我们创建 ...

  9. Java 从入门到进阶之路(十八)

    在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object. 在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更 ...

随机推荐

  1. Effective C++: 03资源管理

    所谓资源,就是一旦用了它,将来必须还给系统.C++中的资源有:内存.文件描述符.互斥锁.数据库连接.网络socket等. 13:以对象管理资源 1:像下面这个函数: void f() { Invest ...

  2. 巨蟒python全栈开发-第11阶段 ansible3_3入门playbook剧本

    1.playbook剧本 2.playbook传参 3.setup模块介绍 4.playbook的tags 5.playbook的handlers&&templates模块 6.条件和 ...

  3. Java练习 SDUT-1704_统计数字问题

    统计数字问题 Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description 一本书的页码从自然数1 开始顺序编码直到自然数n.书的页码 ...

  4. 14海量日志提取出现次数最多的IP

    问题描述:现有某网站海量日志数据,提取出某日访问该网站次数最多的那个IP. 分析:IP地址是32位的二进制数,所以共有N=2^32=4G个不同的IP地址, 如果将每个IP地址看做是数组的索引的话,那么 ...

  5. 出现 java.net.ConnectException: Connection refused 异常的原因及解决方法

    1 异常描述 在启动 Tomcat 服务器的时候,控制台一直输出异常信息,然后停止服务器,报出如下异常: 2 异常原因 通过观察上图中被标记出来的异常信息,咱们可以知道 java.net.Connec ...

  6. BLOB类型对应Long binary,CLOB对应Long characters

    BLOB类型对应Long binary,CLOB对应Long characters

  7. jq获取单选框、复选框、下拉菜单的值

    1.<input type="radio" name="testradio" value="jquery获取radio的值" /> ...

  8. 2018-11-19-win10-uwp-使用-Matrix3DProjection-进行-3d-投影

    title author date CreateTime categories win10 uwp 使用 Matrix3DProjection 进行 3d 投影 lindexi 2018-11-19 ...

  9. H3C CSMA/CD冲突检测和退避

  10. 【转载】.NET中使用Redis

    Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. 最近 ...