java基礎學習之五:引用資料型別
一、所謂引用型別
1、所謂引用:
引用型別(reference type)指向一個物件,不是原始值,指向物件的變數是引用變數。即地址的儲存.
2、引用型別的賦值
在java程式語言中,用類的一個型別宣告的變數被指定為引用型別,這是因為它正在引用一個非原始型別,這對賦值具有重要的意義。如下程式碼:
int x = 7;
int y = x;
String s = "Hello";
String t = s;
由於x y 是基本資料型別:x y的賦值 僅僅是變數值的複製.x,y任何一個發生變化不會對另外一個造成影響.
但是對於String引用型別來說,s中儲存了"hello"的地址,在將s賦值給t的時候,是把指向"hello"的地址賦值給了t
如果將變數t重新定義為t="World";則新的物件World被建立,而t引用這個物件。 從此s和t無影響
3、Object :Object是一個很重要的類,Object是類層次結構的根類,每個類都使用Object作為超類,所有物件(包括陣列)都實現這個類的方法。用Object可以定義所有的類,如:
Object object= new Integer(1); //來定義一個Interger類
Integer i=(Integer) object; //在來把這個Object強制轉換成Interger類
二、引用的注意事項
1.按值傳遞和按引用傳遞的區別
1)按值傳遞
在函式的引數中:按值傳遞僅僅是對變數值進行簡單的拷貝,而變數本身沒有發生變化,如:
/**
* Created by zhaomingwei on 15/11/24.
*/
public class test {
public static void main(String[] args){
int a = 2;
add(a); //輸出3
System.out.println(a);//2
System.out.println(++a);//3
}
public static void add(int a){
++a;
System.out.println(a);
}
}
可見a的值在呼叫add(a)之後並沒有變化,add(int a)中的a與上面main中的a並沒有什麼關係,只是形式引數.
2)傳遞引用型別也是按值傳遞
Java中的方法都是按值傳遞的,對於引用型別的傳遞,也只是傳遞了個地址
有的同學經常不明白這一點:如:
public class test {
public static void main(String[] args){
String str = "hello" ;
System.out.println(str);
change(str);
System.out.println(str);
}
public static void change(String str){
str = str +"world";
System.out.println("引用已變"+str);
}
}
結果:
hello
引用已變helloworld
hello
在學習的時候很多人對此不理解:這是對String的性質不理解,從而導致對於引用的不清楚,
String型別是final的對於已經給定的引用的值是不變的,如果對String型別進行變化,
只是對String的引用做了修改,指向了新的引用,這從實際意義上來講只是引用的複製,
本質上還是值傳遞.引用的值並沒有發生變化
再例如:
public class test {
public static void main(String[] args){
StringBuffer str = new StringBuffer("hello") ;
System.out.println(str);
change(str);
System.out.println(str);
}
public static void change(StringBuffer str){
str = str.append("world");
System.out.println("引用不變:"+str);
}
}
結果:
hello
引用不變:helloworld
helloworld
所以引用的地址變了對於原來的引用的內容並沒有改變,對於引數的引用地址更沒有改變,因為Java中只有值傳遞
原本本節準備說String但是為了循序漸進講解引用型別和相關的知識:下節再說說String吧
相關文章
- [java基礎]之資料型別Java資料型別
- java基礎之java的基本資料型別Java資料型別
- Java基礎語法之資料型別Java資料型別
- [Java基礎]之 資料型別轉換Java資料型別
- JavaScript 基礎 (二) - 引用資料型別 (物件)JavaScript資料型別物件
- java資料型別基礎Java資料型別
- 基礎篇:JAVA引用型別和ThreadLocalJava型別thread
- python基礎之資料型別Python資料型別
- js資料型別之基本資料型別和引用資料型別JS資料型別
- JAVA中基本資料型別和引用資料型別Java資料型別
- MySQL基礎之----資料型別篇(常用資料型別)MySql資料型別
- C++基礎學習2-資料型別C++資料型別
- 談談Java基礎資料型別Java資料型別
- java基礎知識--資料型別Java資料型別
- Java中的基本資料型別與引用資料型別Java資料型別
- Go 基礎之基本資料型別Go資料型別
- 第五課 Python基礎資料型別2Python資料型別
- Python學習之資料型別Python資料型別
- JAVA基礎--資料型別和運算子Java資料型別
- java基礎之一:基本資料型別Java資料型別
- C#學習筆記之值型別與引用型別C#筆記型別
- 前端基礎之JavaScript的資料型別前端JavaScript資料型別
- 基礎資料型別資料型別
- Python基礎之四:Python3 基礎資料型別Python資料型別
- Python學習之旅(核心程式設計基礎篇6基礎資料型別③)Python程式設計資料型別
- JavaScript學習之資料型別(1)JavaScript資料型別
- Redis 入門 - 五大基礎型別及其指令學習Redis型別
- 碎片化學習Java(四)-- Java資料型別Java資料型別
- JAVA基礎之九-泛型(通用型別)Java泛型型別
- 區別值型別資料和引用型別資料型別
- Kotlin 基礎 - 資料型別Kotlin資料型別
- Python資料型別基礎Python資料型別
- PHP基礎-資料型別PHP資料型別
- 大資料之JAVA基礎(五):迴圈和陣列方法練習大資料Java陣列
- 大資料學習之Linux基礎大資料Linux
- go語言資料型別-基礎型別Go資料型別
- python基礎之資料型別及相關方法Python資料型別
- Python基礎之集合和資料型別轉換Python資料型別
- java基礎型別原始碼解析之HashMapJava型別原始碼HashMap