Java 从入门到进阶之路(十九)
在之前的文章我们介绍了一下 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 从入门到进阶之路(十九)的更多相关文章
- Java 从入门到进阶之路(九)
之前的文章我们介绍了一下 Java 中的构造方法,接下来我们再来看一下 Java 中的引用型数组类型. 现在我们想定义一个坐标系,然后通过横坐标(row)和纵坐标(col)来确定一个坐标点,代码如下: ...
- Java 从入门到进阶之路(十)
之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承. 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继 ...
- Java 从入门到进阶之路(十二)
在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...
- Java 从入门到进阶之路(十五)
在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...
- Java 从入门到进阶之路(十四)
在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...
- Java 从入门到进阶之路(十六)
在之前的文章我们介绍了一下 Java 中类的多态,本章我们来看一下 Java 中类的内部类. 在 Java 中,内部类分为成员内部类和匿名内部类. 我们先来看一下成员内部类: 1.类中套类,外面的叫外 ...
- Java 从入门到进阶之路(二十)
在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...
- Java 从入门到进阶之路(二十二)
在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator. 当我们创建 ...
- Java 从入门到进阶之路(十八)
在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object. 在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更 ...
随机推荐
- Mybatis通过工具类根据用户名查找用户列表
抽取SqlSessionFactoryUtils工具类,共享SqlSessionFactory创建过程 /** * SqlSessionFactory工具类 * @author:Mr.Tan * @C ...
- 5G时代-计算机和网络的又一个春天
预言 5G时代的到来计算机和网络即将再次变成热门,计算机和网络的前途将不可限量,就经济学思想来说一定是最具有经济价值的技术,计算机和网络将蓬勃发展,迅速膨胀,经济价值变得极高.将成为科技和智能生活的最 ...
- iOS 11 适配UIWebView,页面下移20的问题
方案1: AppDelegate文件 didFinishLaunchingWithOptions()中添加如下代码 if (@available(iOS 11.0, *)) { [[UIScrollV ...
- Spring AOP 的实现 原理
反射实现 AOP 动态代理模式实例说明(Spring AOP 的实现 原理) 比如说,我们现在要开发的一个应用里面有很多的业务方法,但是,我们现在要对这个方法的执行做全面监控,或部分监控.也许我们 ...
- @bzoj - 4381@ [POI2015] Odwiedziny
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一棵 n 个点的树,树上每条边的长度都为 1 ,第 i 个点 ...
- docker + jenkins 自动化部署
公司书架上有本docker的书籍,正好最近事不多就写个demo来玩一玩. DevOps未死,ContainerOps已到 ContainerOps VS DevOps 避免了复杂的环境,应用之间的相互 ...
- LRJ-Example-06-12-Uva572
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #include <string ...
- avalon2 第一个demo
<!DOCTYPE html> <html> <head> <title>TODO supply a title</title> <m ...
- Java开发中RMI和webservice区别和应用领域
Java开发中RMI和webservice区别和应用领域 一.RMI和webservice区别和联系 0. 首先,都是远程调用技术. 1. RMI是在TCP协议上传递可序列化的java对象(使用Str ...
- set和map容器、
set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...