为什么需要包装类?

首先,Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,将每个基本数据类型设计一个对应的类进行代表,这种方式增强了Java面向对象的性质。

其次,如果仅仅有基本数据类型,那么在实际使用时将存在很多的不便,很多地方都需要使用对象而不是基本数据类型。比如,在集合类中,我们是无法将int 、double等类型放进去的,因为集合的容器要求元素是Object类型。而包装类型的存在使得向集合中传入数值成为可能,包装类的存在弥补了基本数据类型的不足。

此外,包装类还为基本类型添加了属性和方法,丰富了基本类型的操作。如当我们想知道int取值范围的最小值,我们需要通过运算,如下面所示,但是有了包装类,我们可以直接使用Integer.MAX_VALUE即可。

//求int的最大值
int max = 0;
int flag = 1;
for (int i=0; i<31; i++) {max += flag;flag = flag << 1;
}
System.out.println(max +" "+ Integer.MAX_VALUE); //2147483647      2147483647

包装类的2种主要用途:

java中的数据类型int,double等不是对象,无法通过向上转型获取到Object提供的方法,而像String却可以,只因为String是一个对象而不是一个类型。基本数据类型由于这样的特性,导致无法参与转型,泛型,反射等过程。为了弥补这个缺陷,java提供了包装类。

  • 作为 和基本数据类型对应的类 类型存在,方便涉及到对象的操作。
  • 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。

为什么要保留基本数据类型?

我们都知道在Java语言中,用new关键字创建的对象是存储在堆里的,我们通过栈中的引用来使用这些对象,所以,对象本身来说是比较消耗资源的。对于经常用到的类型,如int等,如果我们每次使用这种变量的时候都需要new一个对象的话,就会比较笨重了。所以,Java提供了基本数据类型,这种数据的变量不需要使用new在堆上创建,而是直接在栈内存中存储,因此会更加高效。

包装类(wrapper class/ラッパークラス),自动拆箱,自动装箱,基本类型与字符串之间的转换

Java中的包装类

JAVA中包装类的作用

Java 包装类是什么

Java数据类型

Java常量

类型 含义 数据举例
整数常量 所有的整数 0,1, 567, -9
小数常量 所有的小数 0.0, -0.1, 2.55
字符常量 单引号引起来,只能写一个字符,必须有内容 ‘a’ , ’ ', ‘好’
字符串常量 双引号引起来,可以写多个字符,也可以不写 “A” ,“Hello” ,“你好” ,“”
布尔常量 只有两个值(流程控制中讲解) true , false
空常量 只有一个值(引用数据类型中讲解) null
package ArrayTest;public class Array10 {char a;public static void main(String[] args) {new Array10().re();}public void re(){System.out.println("a = " + a);System.out.println(a==0);System.out.println(a=='\u0000');System.out.println(a==null);//编译报错}
}

‘\u0000’~'\UFFFF’是什么意思

范围:0到65535。它不过对应的是unicode的编码值,即全球语言统一编码。

\u开头的是一个Unicode码的字符,每一个’\u0000’都代表了一个空格。

通常中文在的显示都是被转化为Unicode显示的。

Java变量

  • 基本数据类型:整数、浮点数、字符、布尔
  • 引用数据类型: 类、数组、接口
数据类型 关键字 内存占用 取值范围
字节型 byte 1个字节 -128 至 127
短整型 short 2个字节 -32768 至 32767
整型 int 4个字节 -231 至 231-1
长整型 long 8个字节 -263 至 263-1
单精度浮点数 float 4个字节 1.4013E-45 至 3.4028E+38
双精度浮点数 double 8个字节 4.9E-324 至 1.7977E+308
字符型 char 2个字节 0 至 216-1
布尔类型 boolean 1个字节 true,false

Java提供的包装类

class IntDemo {private int num;public IntDemo(int num) {this.num = num;}public int intValue() {return this.num;}
}

虽然上面的IntDemo类能实现一些辅助功能,而且可以支持泛型反射等功能,但是如果如果每次使用都自己封装这么一个类的话,就太繁琐了。所以,java为我们提供了基本数据类型的包装类,这些包装类分为两类,一种是对象型包装类,不继承任何其他类(Object的直接子类),另一种是数值型包装类,继承于Number类。

对象型(Object 的直接子类)包装类:

// boolean的包装类
public final class Boolean implements java.io.Serializable, Comparable<Boolean>// char的包装类
public final class Character implements java.io.Serializable, Comparable<Character>

数值型(继承了Number类)包装类:

// byte的包装类
public final class Byte extends Number implements Comparable<Byte>// short的包装类
public final class Short extends Number implements Comparable<Short> // int的包装类
public final class Integer extends Number implements Comparable<Integer>// long的包装类
public final class Long extends Number implements Comparable<Long> // float的包装类
public final class Float extends Number implements Comparable<Float> // double的包装类
public final class Double extends Number implements Comparable<Double>

Boolean和Character两个类就是正常的属性方法封装,但是数值型的包装类继承了一个Number类。

public abstract class Number implements java.io.Serializable

其中定义的方法如下:

Java装箱拆箱

  • 装箱:从基本类型转换为对应的包装类对象。int→Integer

  • 拆箱:从包装类对象转换为对应的基本类型。Integer→int

手动装箱拆箱

// 装箱
Integer integer1 = new Integer(1);
//或者
Integer i2 = Integer.valueOf(4);
// 拆箱
int integer2 = integer1.intValue();

自动装箱拆箱

由于我们经常要做基本类型与包装类之间的转换,sun公司发现这样写比较麻烦,于是从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。

自动装箱:可以直接把一个基本类型的数据赋值给自己对应的包装类型。

自动拆箱:可以直接把一个包装类型的数据赋值给自己对应的基本类型。

// 自动装箱
Integer integer1 = 1;
Integer i = 4;//相当于i = Integer.valueOf(4);// 自动拆箱
int integer2 = integer1;
i = i + 5;//相当于i.intValue() + 5;

基本类型与字符串之间的转换

基本类型转字符串

  1. 可以直接使用+号
  2. 使用String类中的valueOf()方法
  3. 使用对应的包装类中重载的toString()方法

byte、short、char–>int–>long–>float–>double

public class Demo01 {public static void main(String[] args) {//使用+完成基本数据类型到字符串的转换int x=123;String s=x+"";//使用String类中的valueOfint i = 1;String s1 = String.valueOf(1.2);String s2 = String.valueOf(true);String s3 = String.valueOf(i);String s0 = String.valueOf('a');int j = 2;byte x = 2;short y = 2;long l =2;//使用对应的包装类中重载的toString方法String s8 = Byte.toString(x);String s9 = Byte.toString((byte) 2);String s13 = Short.toString(y);String s12 = Short.toString((short) 3);String s14 = Long.toString(l);}
}

字符串转换成对应的基本类型

  • 字符串转成基本类型使用包装类中的parseXxxx方法。

public static int parseInt(String s):将字符串参数转换为对应的int基本类型

  • 后期学习中遇到和parse相关的函数,都是把字符串解析成其他的数据。

  • 使用parseXxxx方法把一个字符串转成基本数据类型的时候,前提是这个字符串一定能够被转成对应的基本类型,否则会发生NumberFormatException异常。

package com.web;public class Test43 {public static void main(String[] args) {//字符串转成基本类型使用包装类中的parseXxxx方法int num = Integer.parseInt("100");byte b1 = Byte.parseByte("2");byte b3 = Byte.parseByte("a");short sh = Short.parseShort("2");}
}

为什么需要java包装类,装箱拆箱,基本类型与字符串之间的转换,java数据类型相关推荐

  1. java自动装箱拆箱原理

    java自动装箱拆箱原理 看了很多博主都没写原理,只是浅显地说了自动装箱拆箱的含义,我就把这个必须知道的知识写一下吧 1.自动装箱 以int -> Integer为例,Integer integ ...

  2. Java包装类的拆箱和装箱是怎么回事?

    什么是自动装箱和拆箱 自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱. ...

  3. Java自动装箱/拆箱 - Java那些事儿

    昨天Java基本数据类型和引用类型一文中漏了几张图,已经补上,需要的自己回头去看,本系列文章首发于公众号:saysayJava. 在让人疑惑的Java代码 - Java那些事儿 一文中我们说到编译器自 ...

  4. Java自动装箱/拆箱

    自动装箱和自动拆箱 那么Java中有八大基本数据类型,byte.char.short.int.long.double.float.boolean.而它们有对应的包装类 Byte.Character.S ...

  5. 【Java】装箱拆箱

    什么是自动装箱和拆箱 自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱. ...

  6. 深入理解Java自动装箱拆箱机制(Autoboxing and unboxing)

    1.自动装箱与拆箱的定义 装箱就是自动将基本数据类型转换为包装器类型(int-->Integer): 拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int). Java中 ...

  7. java自动装箱拆箱深入剖析

    这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆:  java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装 ...

  8. Java包装类、拆箱和装箱详解

    虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备"对象"的特性--不携带属性.没有方法可调用. 沿用它们只是为了迎合 ...

  9. JAVA 自动装箱拆箱

    在需要的情况下,基本类型与包装类型可以通用.有些时候我们必须使用引用数据类型时,可以传入基本数据类型. 比如: 基本类型可以使用运算符直接进行计算,但是引用类型不可以.而基本类型包装类作为引用类型的一 ...

最新文章

  1. 基于Erlang语言的视频相似推荐系统 | 深度
  2. kafka存储机制与读写流程
  3. matlab示波器显示部分,Matlab 示波器显示设置
  4. python写excel文件出错_【求教】xlutils修改中文Excel文件出错
  5. after exercise
  6. linux 镜像自动安装,制作能自动安装的CentOS镜像文件
  7. 阿里妈妈基于TensorFlow做了哪些深度优化?TensorFlowRS架构解析
  8. w ndows7端口在哪里,win7电脑遇到端口被占用的情况该如何查看并将其关闭
  9. CoreCLR源码探索(六) NullReferenceException是如何发生的
  10. 爬虫基础12(框架Scrapy中间件)
  11. linux系统英伟达gpu驱动卸载_英伟达显卡驱动程序被发现强制捆绑 官方已火速撤回驱动下载链接...
  12. 贾跃亭与孙宏斌的塑料兄弟情
  13. Sql Server 2005各大版本区别与下载
  14. POJ2752 (Seek the Name, Seek the Fame,kmp)
  15. HDU2095find your present (2)【hash】
  16. 关于STM32红外遥控器的研究与分析
  17. Excel常用功能总结
  18. SpringBoot 单元测试——JUnit5
  19. vue 倒计时 插件_VUE-倒计时插件使用(订单,砍价,拼团,倒计时使用)
  20. Dreamweaver视频教程(共53课时)

热门文章

  1. 【Python爬虫】 验证码图像识别 --- 第三弹 (极验验证码识别)
  2. 简单的SQL注入原理
  3. 一机一码_098 吹风机 一机一码
  4. mysql dbhelper 下载_DBHelper数据库肋手
  5. 理解https原理以及配置---根据以下步骤帮助理解
  6. 邮政营销计算机考试,邮政业务营销员操作试题
  7. https协议的一些杂谈
  8. 3ds  max中复制、实例和参考的区别
  9. 矩阵转置python的实现
  10. 2022/12/23