1. 程式人生 > >java關於new出一個物件的例子

java關於new出一個物件的例子

首先看下面一段程式碼:
public class ChangeStr {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };


public static void main(String args[]) {
ChangeStr  ex = new ChangeStr ();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
}


public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'g';
}
}
有不少人不知道這個的輸出結果是什麼,讓我來告訴大家吧,是    good and gbc。
String str=null
      表示str還沒有被“new”,就是物件的引用還沒有建立,也就是還沒有分配記憶體給他。此時不能用比較的函式進行操作,如if(str.equals("")),會丟擲空指標異常。if("".equals(str))不會丟擲異常,返回false。str!=""返回true,str ==null返回true。
       System.out.println(str);輸出結果為:null。因為null值可以強制轉換為任何java類型別,輸出時null值被轉換成String型別。
String str ;     String str =new String()。
       表示str已經被“new”了,只是內容為空。str不是一個空引用,要分配記憶體空間。
第一種是用new()來新建物件的,它會在存放於堆中。每呼叫一次就會建立一個新的物件。 
而第二種是先在棧中建立一個對String類的物件引用變數str,然後查詢棧中有沒有存放"abc",如果沒有,則將"abc"存放進棧,並令str指向”abc”,如果已經有”abc” 則直接令str指向“abc”。


對於string型別:當呼叫change方法時,方法的引數會被當做方法的私有變數進行建立,這時記憶體機制是這樣的,就是在棧中有兩個不同的引用(全域性變數str和方法內部的變數str)同時指向了堆中的一個物件,但是你在方法內部對對方法內部的私有變數進行重新賦值後,只是改變了方法內部變數的指向,對全域性的str指向並沒有影響。而方法結束後區域性的str生命週期就會結束,而之後被垃圾回收。
簡單來說
這裡的str="test ok"只是修改的區域性變數str,不是類的成員變數。類的成員變數並沒有被修改,如果你把引數裡的str換成str1你在試試看,輸出的結果就是test ok 了。而char是原始型別,也就是本身不是物件,是直接放在棧裡的。也就是說傳遞的就是本身的地址。所以結果裡是被修改了的。。


希望朋友們能看懂,並且能夠理解。