基本數據類型變量存儲的是值,引用類型存儲的是對象的引用(對象的地址)。
基本數據類型不具有對象的特性,當有些地方必須要使用對象的時候,例如集合類(在後面詳細分析)(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 [[email protected]]
* @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;
}
}