首頁  >  文章  >  Java  >  Java一切都是物件

Java一切都是物件

巴扎黑
巴扎黑原創
2017-06-26 11:42:371297瀏覽

1、用引用操作對象

  在java中一切都被視為對象,操作對象實際上的操作對象的一個「引用」。兩者之間的關係就等於用遙控器(引用)來操作電視機(物件)。擁有一個引用,不一定需要有一個物件與它關聯,例如Sting a;只是聲明了一個引用並沒有關聯到一個物件。

2、必須由你創建所有物件

  一但創建了一個引用,就希望與一個物件相關聯,通常用new來新建一個物件(java中字串可以用帶引號的文字初始化)。

  2.1、儲存位置

  (1)暫存器。最快的儲存區(位於處理器內部),java中無法人為直接控制(c++/c中允許向編譯器建議暫存器分配方式)。

  (2)堆疊。位於RAM中,堆疊指標向下移動分配新的內存,向上移動釋放內存,速度很快,僅次於寄存器。但是創建系統時java系統必須知道儲存在堆疊內所有項目的確切宣告週期,以便於上下移動指標。這項約束限制了程式的靈活性,一些基本類型的變數和物件的參考(java物件並不在其中)被存放在堆疊中。

  (3)堆。一種通用記憶體池(位於RAM中),用於存放所有的java物件。堆不同於棧的好處是:編譯器不需要知道儲存的資料在堆中存活多長事件。當new一個物件時會自動在堆中分配記憶體進行儲存。在不需要該物件時由編譯器自動回收無需人為控制。當然,這種靈活性是需要付出代價的:比起c/c++在堆疊中建立物件需要更多的時間。

  (4)常數儲存。常量值通常直接存放在程式碼內部,因為常數值永遠不會改變。

  (5)非RAM儲存。數據存活於程序之外,可以不受程序的任何控制。例如流對象和持久化對象。

  2.2、特例:基本類型

  程式設計中常用到的一系列類型,例如整數,小數,字元......這些類型被稱為基本類型,被特殊對待。

  為什麼要特殊對待? new是將物件儲存在堆中,之前說到存在堆中的數據需要的時間更長,所以對於這些經常用到的,特別小的,簡單的數據,如果存在堆中代價太大。因此java不用new來創建變量,而是創建一個並非是引用的「自動」變量。這個變數直接存值並置於堆疊中。基本型別所佔儲存空間大小是固定的。

  為了適應萬物皆對象,基本類型都有一個包裝器類,使得可以在堆中創建一個非基本對像用來表示對應的基本類型。

  例如:

char c='a';
Character ch=new Character(c);
或者
Character ch=new Character('a');

  java se5中的自動包裝功能是的兩者之間可以自動轉換。

  2.3、作用域

  變數作用域:變數包含直接存值的基本型別和類別的參考。只在程式碼段內存活。

  物件作用域:

{
    String s=new String("string");      
}//end of scope

  引用s存在堆疊上,在作用域終點生命終結。然而s指向的String物件繼續存活在堆中。由java的垃圾回收器來判斷何時回收該物件。這樣做消除了大部分「記憶體外洩」的問題。

  2.4、方法參數

  java和c/c++不同,對於java的方法參數到底是傳值還是傳引用很多人搞不清楚。對於基本資料型別傳遞的是值,因為基本資料是直接存值在堆疊區。物件傳遞的是引用(棧區的物件引用即堆區物件的位址)。以String和StringBuilder來說明。

  下面看兩個例子。

public class Test
{public static void test(String str)
        {
            str = "world"+str;
        }public static void main(String[] args)
        {
            String  str1 = new String("hello");
            test(str1);
            System.out.println(str1);
        }
}

  上面範例的輸出結果還是hello,為什麼呢?因為test中對str的修改並不是原來物件上的修改,這裡就牽涉到了String物件的特點,String物件建立後無法修改,上面的修改其實是:新建一個空的StringBuilder然後呼叫append方法插入“world”,str,然後呼叫toString方法新建一個新的String物件。所以此時str的參考物件已經是全新的了,所以主函數中str1並未改變。下面再看個StringBuilder的例子。

public class test1 {    static void test(StringBuilder str){
        str.append("1234");
    }    public static void main(String[] args) {
        StringBuilder a=new StringBuilder("abc");
        test(a);
        System.out.println(a.toString());
    }
}

  上面輸出結果abc1234,test中對str的修改同時也對a生效,因為str和a的引用都是指向同一個StringBuilder對象,而StringBuilder是可修改的。這裡足以說明傳遞的是引用。

以上是Java一切都是物件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn