java基礎學習之五:引用資料型別

趙明威發表於2015-11-24

一、所謂引用型別

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吧

相關文章