Java的引用

來源:互聯網
上載者:User

標籤:

     總所周知,Java語言風格類似C和C++,繼承學習了C++語言的物件導向技術的核心,同時去除了C++語言的指標,改用引用(refrence)取代。那為什麼要去除指標呢,改用引用,引用與指標又有什麼區別呢?

1、指標是什嗎?     指標是C語言的靈魂,指標(變數)是儲存地址的變數,它實質是”間接定址“的抽象,即通過一個變數尋找所需要的地址。下面是一個簡單的C語言指標執行個體:
#include <stdio.h>#include <stdlib.h>int main(){    int a = 3, b = 4;    swap(&a, &b);    printf("a = %d \n", a);    printf("b = %d ", b);    return 0;}void swap(int *a, int *b){    int temp = *a;    *a = *b;    *b = temp;}

 通過指標能夠方便並快速對變數進行底層操作,非常方便,使代碼非常簡潔,但是指標太靈活,太強大,很容易造成記憶體流失和產生off-the-end指標。利用指標編寫的程式也更容易隱含各式各樣的錯誤,同時程式的可讀性也會大打折扣。所以Java去除了指標,而採用更加安全可靠的引用。

2、引用     那引用是什嗎?如果說指標是對地址的抽象,那引用(refrence)是對同一性(identity)的抽象。不是同一層級的概念。引用是封裝了對象的地址,但它與指標還是有區別的,使用引用可以讓使用Java程式員能夠像操作基礎資料型別 (Elementary Data Type)一樣操作對象,引用是受限的,不能對引用進行地址運算,只能進行賦值操作。
Object o;   //這裡是在堆棧中的建立的控制代碼(Handle)o = new Object();    //在堆中建立對象,並使控制代碼指向該對象

  引用或控制代碼相當於電視機的遙控器,對遙控器操作,就能操作電視機,實際上,但我們按下”調小音量“,我們實際上操作的是遙控器,再有遙控器操作電視機,等價於直接操作電視機。當我們到處走走的話只需拿著遙控器即可,無需拿著電視機。引用是引用對象的遙控器,我們不能直接操作對象,只能通過引用進行操作。

     個人感覺,Java中的引用是對對象的抽象,程式員使用引用就等價於使用對象,當然引用內部肯定包含了對象的地址。3、引用與指標的區別      C與C++中的指標,方便使用者快速對變數進行底層操作,指標能夠運算,通過指標能夠訪問指標指向的變數。     Java中的引用是對對象的抽象,Java的設計者讓使用者類似操作基礎資料型別 (Elementary Data Type)的方法操作引用從而間接操作對象,程式員無法獲得引用的值,無法對引用進行操作。只能進行賦值操作。綜上所述,Java中的引用可以看作受限的指標,該指標程式無法確定其值,也無法對指標進行運算。4、Java的值傳遞     Java的變數類型有兩種,基本類型和參考型別。     (1)基本類型的參數傳遞:基本類型的參數傳遞類似於C語言中的值傳遞。執行個體如下:
package com.cang.refrence; public class TestPrimitive {            public static void main(String[] args) {            int a = 3, b = 4;            System. out.println( "Before swap the a and b: a = " + a + ",b = " + b);            swap( a, b);           System. out.println( "After swap the a and b: a = " + a + ",b = " + b );     }       public static void swap( int a, int b) {            int temp = a;            a = b;            b = temp;     }}

  運行結果:

記憶體抽象:    (2)參考型別的參數傳遞
public class TestRefrence {                 public static void main(String[] args) {                     StringBuffer buffer= new StringBuffer( "colin");                 SChange( buffer);                 System. out.println( buffer);             }                          public static void SChange (StringBuffer str) {                 str= new StringBuffer( "huang");             }      }

結果:colin

記憶體抽象:  如所示,傳遞引用時,將引用的副本傳遞給方法的參數,但由於在方法裡對該引用的拷貝進行賦值,所以該引用的拷貝指向其他對象,而不是原來的對象。
public class TestRefrence2 {         public static void main(String[] args) {                     StringBuffer buffer= new StringBuffer( "colin");                 SChange( buffer);                 System. out.println( buffer);             }                          public static void SChange (StringBuffer str) {           str.append( "huang");         }            }

結果:colinhuang

記憶體抽象:  綜上所述,Java的方法傳遞只有值傳遞,基礎資料型別 (Elementary Data Type)傳遞是其值,而參考型別傳遞的是引用變數。  

Java的引用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.