背景
新語(yǔ)言Kotlin已經(jīng)拋棄了Java里的基本數(shù)據(jù)類型兼蜈,而是采用引用類型去聲明一個(gè)變量历等,那么怎么區(qū)分基本數(shù)據(jù)類型和引用類型呢妇智?
文字概念
基本數(shù)據(jù)類型:byte滥玷、short、int巍棱、long惑畴、float、double航徙、char如贷、boolean
引用類型:類(class)、接口(interface)到踏、數(shù)組(array)
基本類型保存的值杠袱,引用類型保存了是對(duì)象的地址,所有基本類型賦值是按值傳遞(拷貝賦值)窝稿,引用類型賦值是按引用傳遞楣富。
圖與代碼解析
參考:知乎作者:Intopass
一:搞清楚 基本類型 和 引用類型的不同之處
int num = 10;
String str = "hello";
如圖所示,num是基本類型伴榔,值就直接保存在變量中纹蝴。而str是引用類型,變量中保存的只是實(shí)際對(duì)象的地址潮梯。一般稱這種變量為"引用"骗灶,引用指向?qū)嶋H對(duì)象,實(shí)際對(duì)象中保存著內(nèi)容秉馏。
如圖所示耙旦,num是基本類型,值就直接保存在變量中萝究。而str是引用類型免都,變量中保存的只是實(shí)際對(duì)象的地址。一般稱這種變量為"引用"帆竹,引用指向?qū)嶋H對(duì)象绕娘,實(shí)際對(duì)象中保存著內(nèi)容。
二:搞清楚賦值運(yùn)算符(=)的作用
num = 20;
str = "java";
對(duì)于基本類型 num 栽连,賦值運(yùn)算符會(huì)直接改變變量的值险领,原來的值被覆蓋掉侨舆。
對(duì)于基本類型 num ,賦值運(yùn)算符會(huì)直接改變變量的值绢陌,原來的值被覆蓋掉挨下。對(duì)于引用類型 str,賦值運(yùn)算符會(huì)改變引用中所保存的地址脐湾,原來的地址被覆蓋掉臭笆。但是原來的對(duì)象不會(huì)被改變(重要)。如上圖所示秤掌,"hello" 字符串對(duì)象沒有被改變愁铺。(沒有被任何引用所指向的對(duì)象是垃圾,會(huì)被垃圾回收器回收)
三:調(diào)用方法時(shí)發(fā)生了什么闻鉴?參數(shù)傳遞基本上就是賦值操作茵乱。
第一個(gè)例子:基本類型
void foo(int value) {
value = 100;
}
foo(num); // num 沒有被改變
第二個(gè)例子:沒有提供改變自身方法的引用類型
void foo(String text) {
text = "windows";
}
foo(str); // str 也沒有被改變
第三個(gè)例子:提供了改變自身方法的引用類型
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
builder.append("4");
}
foo(sb); // sb 被改變了,變成了"iphone4"椒拗。
第四個(gè)例子:提供了改變自身方法的引用類型似将,但是不使用,而是使用賦值運(yùn)算符蚀苛。
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
builder = new StringBuilder("ipad");
}
foo(sb); // sb 沒有被改變在验,還是 "iphone"。
重點(diǎn)理解為什么堵未,第三個(gè)例子和第四個(gè)例子結(jié)果不同腋舌?
下面是第三個(gè)例子的圖解:
builder.append("4")之后
下面是第四個(gè)例子的圖解:
builder = new StringBuilder("ipad"); 之后
再次強(qiáng)調(diào),參考來源于知乎作者:Intopass