基本数据类型变量存储的是值,引用类型存储的是对象的引用(对象的地址)。
基本数据类型不具有对象的特性,当有些地方必须要使用对象的时候,例如集合类(在后面详细分析)(List,Set等),基本数据类型就不能使用了,所以Java提供了包装类。基本数据类型可以进行加减乘除等运算,而包装类提供了很多实用的方法和对象的属性。在Java程序进行编译时,编译器会自动的根据具体情况对基本数据类型变量和包装类对象进行装箱和拆箱。
一、什么是自动装箱拆箱
很简单,下面两句代码就可以看到装箱和拆箱过程
1 //自动装箱
2 Integer total = 99;
3
4 //自动拆箱
5 int totalprim = total;
基本数据类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
1.基本数据类型:
byte:字节类型,Java中最小的数据类型,1个字节,占8位,取值范围-128~127,默认值0
char:字符型,用于存储单个字符,2个字节,占16位,取值范围0~65535,默认值为空
short:短整型,2个字节,占16位,取值范围-32768~32717,默认值0
int:整型,用于存储整数,4个字节,占32位,取值范围-2147483648~2147483647,默认值0
long:长整型,8个字节 占64位,-2^63~2^63-1,默认值0L
float:浮点型,占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有
6~7位),默认值0
double:双精度浮点型,用于存储带有小数点的数字,8个字节 占64位,默认值0
boolean:布尔类型,1个字节 占8位,用于判断真或假(仅有两个值,即true、false),默认值false
2.引用数据类型:
类、接口类型、数组类型、枚举类型、注解类型。
区别:
1.基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上。
引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,
然后由栈上面的引用指向堆中对象的地址。
2.引用数据类型在作为Java函数参数(Java的方法参数只传值)时,在函数体内对形参的改变不会改变实参(参数传递时穿的是值的拷贝,引用数据类型传的就是引用的拷贝),但是在函数体内改变引用对象的属性是会改变实参的属性的值的。
包装类相对于基本类型来说都多了null这个值。
/*
* www.unisinsight.com Inc.
* Copyright (c) 2018 All Rights Reserved
*/
package javaSE.base_type;
/**
* description
* 值传递与引用传递的区别
* @author yuwei [yu.wei@unisinsight.com]
* @date 2020/04/28 20:01
* @since 1.0
*/
public class Test {
static int num = 2;
static Person person = new Person();
public static void main(String[] args) {
//值传递
System.out.println(num + "," + getResult(num) + "," + num);
person.setAge(23);
person.setName("zs");
//引用传递
System.out.println(person.toString() + "," + getResultPerson1(person).toString()
+ "," + getResultPerson2(person).toString() + "," + person.toString());
}
/**
* 基本数据类型及其包装类:传参时,是值传递,在方法内对值的更改不会影响原参数
* 这里原参数是2,在方法内将其改为3,最终输出原参数仍为2
* @param param
* @return
*/
public static int getResult(int param) {
param = 3;
return param;
}
/**
* 引用类型:传参时,是传递的引用,在方法内对对象的更改会影响原对象
* 这里原对象的age=23,在方法中age重置为32,执行该方法后,发现原对象的age变为了32
* @param param
* @return
*/
public static Person getResultPerson2(Person param) {
// 改变当前引用的对象的属性
param.setAge(32);
return param;
}
/**
* 引用类型:传参时,是传递的引用,在方法内 改变引用对应的对象,使得引用指向另一个对象
* 如果没有其他引用指向原对象,则原对象不可达,将会被标记为可回收对象。
* @param param
* @return
*/
public static Person getResultPerson1(Person param) {
Person person = new Person();
person.setAge(13);
person.setName("zs111");
// 改变引用对应的对象,使得引用指向另一个对象
param = person;
return param;
}
}