前言:
坚强的意志力不是凭空而来的,需要脚踏实地、日积月累。在培养意志力的过程中,绝不能悲观失望、好高骛远,只要一步一个脚印向前走,就会积少成多,到达预定的目标。
我们上一篇聊到了java之BigDecimal类,这一篇我们聊一下基本类型包装类,针对于以下的概念,都会有实体例子配合着,给大家演示,希望给历险中的你带来一些帮助!!!
一.介绍
Java一种静态编程语言,所有变量和表达式是在编译时就确定的。同时,Java又是一种强类型语言,所有的变量和表达式都有具体的类型,并且每种类型是严格定义的。类型限制了变量可以hold什么样的值,表达式最终会产生什么样的值,可以进行哪些操作。
在Java中共有8中基本类型数据,同时每种基本类型又有对应的包装类。使用基本数据类型,可以改善系统的性能,也能够满足大多数应用需求。但基本简单类型不具有对象的特性,不能满足特殊的需要,这就需要用到我们的包装类。
二.知识点介绍
1、基本数据类型的包装类
2、包装类常用方法
3、装箱与拆箱
三.知识点详解
1、基本数据类型的包装类
Java中每一种基本类型都会对应一个唯一的包装类,基本类型与其包装类都可以通过包装类中的静态或者成员方法进行转换。每种基本类型及其包装类的对应关系如下,值得注意的是,所有的包装类都是final修饰的,也就是它们都是无法被继承和重写的。
以下基本数据类型与包装类的一个对应关系:
基本数据类型
包装类
boolean
Boolean
byte
Byte
cahr
Character
short
Short
int
Interger
long
Long
float
Float
double
Double
代码演示:
package com.Test;
public class Main {
private final static String name = "磊哥java历险记 @51博客";
static boolean boo_lean;
static byte by_te;
static char ch_ar;
static double dou_ble;
static float fl_oat;
static int in_t;
static long lo_ng;
static short sh_ort;
static String str_ing;
public static void main(String[] args) {
System.out.println("Bool :" + boo_lean);
System.out.println("Byte :" + by_te);
System.out.println("Character:" + ch_ar);
System.out.println("Double :" + dou_ble);
System.out.println("Float :" + fl_oat);
System.out.println("Integer :" + in_t);
System.out.println("Long :" + lo_ng);
System.out.println("Short :" + sh_ort);
System.out.println("String :" + str_ing);
System.out.println("============="+name+"=============");
}
}
2、包装类常用方法
从源代码的角度来看,基础类型和包装类型都可以通过赋值语法赋值给对立的变量类型,如下面的代码所示。
Integer a = 1;
int a = new Integer(1);
这种语法是可以通过编译的。但是,Java作为一种强类型的语言,对象直接赋值给引用类型变量,而基础数据只能赋值给基本类型变量,这个是毫无异议的。那么基本类型和包装类型为什么可以直接相互赋值呢?这其实是Java中的一种“语法糖”。“语法糖”是指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。
通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会(来自百度百科)。换句话说,这其实是一种障眼法,那么实际上是怎么样的呢?
Integer a = 1;
其实相当于 Integer a = Integer.valueOf(1);
其他的包装类都是类似的,下表是所有包装类中的类型转换方法。
包装类
包装类转基本类型
基本类型转包装类
Byte
Byte.valueOf(byte)
bytelnstance.byteValue()
Short
ShortvalueOf(short)
shortlnstance.shortValue()
Integer
Integer.valueOf(int)
integerlnstance.intValue()
Long
Long.valueOf(long)
longlnstance.longValue()
Float
FloatvalueOf(float)
floatlnstance.floatValue()
Double
Double.valueOf(double)
doublet nstance.doubleValue()
Character
Character.valueOf(char)
charlnstance.charValue()
boolean
Boolean.valueOf(booleann)
booleanlnstance.booleanValue()
代码演示:
package com.Test;
public class Test1 {
private final static String name = "磊哥java历险记 @51博客";
public static void main(String args[]){
//定义整型对象i
Integer i=new Integer(100);
//定义浮点型对象d
Double d=new Double("123.456");
//i,d转换为int类型
int j=i.intValue()+d.intValue();
//i,d转换为float类型
float f=i.floatValue()+d.floatValue();
System.out.println("转换int类型:"+j);
System.out.println("转换成为float类型:"+f);
//将字符串,转换为double
double pi=Double.parseDouble("3.1415926");
//将字符串,转换为Double
double r=Double.valueOf("2.0").doubleValue();
double s=pi*r*r;
System.out.println("乘法:"+s);
try{
//将字符串,转换为int
int k=Integer.parseInt("1.25");
}catch(NumberFormatException e){
System.out.println("数据格式不对");
}
//十进制转十六进制
System.out.println("十进制转十六进制:"+Integer.toBinaryString(123)+"H");
//十进制转二进制
System.out.println("十进制转二进制:"+Integer.toHexString(123)+"B");
//十进制转八进制
System.out.println("十进制转八进制:"+Integer.toOctalString(123)+"O");
System.out.println("============="+name+"=============");
}
}
3、装箱与拆箱
(1)装箱就是java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱。
自动装箱时编译器调用valueOf()将原始类型值转换成对象。
(2)拆箱就是java自动将对应的对象转换成原始类型值,比如将Integer对象转换成int的变量,这个过程叫做拆箱
自动拆箱时,编译器通过调用类似xxxValue()这类方法(如intValue(),doubleValue())将对象转换成原始类型值。
(3)什么时候会产生装箱与拆箱
①赋值时
需要手动地进行类型转换,而现在所有的转换都是有编译器来完成。
代码演示:
package com.Test;
import java.awt.*;
public class Test1 {
private final static String name = "磊哥java历险记 @51博客";
public static void main(String args[]){
Integer iObject = Integer.valueOf(3);
int iPrimitive = iObject.intValue();
iObject = 3;
iPrimitive = iObject;
System.out.println(iPrimitive);
System.out.println("============="+name+"=============");
}
}
②方法调用时
当在进行方法调用时,可以传入原始数据值或对象,编译器同样会自动进行转换。
package com.Test;
public class Test1 {
private final static String name = "磊哥java历险记 @51博客";
public static void main(String args[]){
show(3);
int result = show(3);
System.out.println(result);
System.out.println("============="+name+"=============");
}
public static Integer show(Integer iParam){
System.out.println("autoboxingexample - method invocation i: " + iParam);
return iParam;
}
}
我们就以Interger类为例,下面看一段代码:
package com.Test;
public class Test1 {
private final static String name = "磊哥java历险记 @51博客";
public static void main(String args[]) {
Integer i = 10;
int n = i;
System.out.println(n);
System.out.println("============="+name+"=============");
}
}
反编译class文件之后得到如下内容:
从反编译得到的字节码内容可以看出,在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法。
其他的也类似,比如Double、Character,初学的兄弟们可以自己手动尝试一下。
因此可以用一句话总结装箱和拆箱的实现过程:
装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的。(xxx代表对应的基本数据类型)。
结语:
人生的奔跑,不在于瞬间的爆发,取决于途中的坚持。很多时候,成功就是多坚持一分钟,只是我们不知道这一分钟会在什么时候出现。所以,在一切尚未定论之前,我们不要停下脚步,或许就在我们喘息、休憩、放弃之际,别人才有机可乘,跑到了我们的前面。纵观天下人与事,成于坚毅,败于废弃,概莫如此。
我会沿着java基础至中阶,高阶,和后面的实战项目,循序渐进,由浅入深,希望能够帮助看到我文章的兄弟们,特别是初学者!感谢大家持续关注!