下面是一個java的基礎(chǔ)試題,我也記不起來在哪里看到了,應(yīng)該有類似這樣的題。我們來看一下。
例題1 :
QUESTION NO: 1
1、

public class Test
{


public static void changeStr(String str)
{

str="welcome";

}


public static void main(String[] args)
{

String str="1234";

changeStr(str);

System.out.println(str);

}

}
QUESTION NO: 2
2,

public class Test
{

public static void group(test1 a)
{
a.setId("2");
}

public static void main(String arg[])
{
test1 a = new Test().new test1();
a.setId("1");
group(a);
System.out.println(a.getId());
}

class test1
{
String id;
String name;

public String getId()
{
return id;
}

public void setId(String id)
{
this.id = id;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}
}
根據(jù)上面的程序 1,我們看看得到的結(jié)果應(yīng)該是什么。
這道題涉及的問題就是對象與對象以用的問題,這個問題大家很容易混淆。這道題的答案是1234。
那么根據(jù)問題1,你能否知道問題2的答案呢,問題2的答案是2.
分析:對對象引用的不是很熟悉的人一定以為問題2的答案應(yīng)該不變也是1,怎么是2呢.
這就是涉及對象以及對象引用的問題了.
一首先介紹一下對象的引用.
創(chuàng)建對象
創(chuàng)建一個對象,其實,它包含了四個動作。object a=new object();
1)右邊的“new object”,是以object類為模板,在堆空間里創(chuàng)建一個object類對象(也簡稱為object對象)。
2)末尾的()意味著,在對象創(chuàng)建后,立即調(diào)用object類的構(gòu)造函數(shù),對剛生成的對象進(jìn)行初始化。構(gòu)造函數(shù)是肯定有的。如果你沒寫,Java會給你補上一個默認(rèn)的構(gòu)造函數(shù)。
3)左邊的“object a”創(chuàng)建了一個object類引用變量。所謂object類引用,就是以后可以用來指向object對象的對象引用。
4)“=”操作符使對象引用指向剛創(chuàng)建的那個object對象。我們可以把這條語句拆成兩部分:
object a;
a= new object();
效果是一樣的。這樣寫,就比較清楚了,有兩個實體:一是對象引用變量,一是對象本身。
在堆空間里創(chuàng)建的實體,與在數(shù)據(jù)段以及??臻g里創(chuàng)建的實體不同。盡管它們也是確確實實存在的實體,但是,我們看不見,也摸不著。
不僅如此,我們仔細(xì)研究一下第二句,找找剛創(chuàng)建的對象叫什么名字?有人說,它叫“object”。不對,“object”是類(對象的創(chuàng)建模板)的名字。一個object類可以據(jù)此創(chuàng)建出無數(shù)個對象,這些對象不可能全叫“object”。
對象連名都沒有,沒法直接訪問它。我們只能通過對象引用來間接訪問對象。
為了形象地說明對象、引用及它們之間的關(guān)系,
為了說明這個關(guān)系,我在網(wǎng)上看到別人的比喻挺好的我也引用一下:
對象好比是一只很大的氣球,大到我們抓不住它。引用變量是一根繩,可以用來系汽球。 如果只執(zhí)行了第一條語句,還沒執(zhí)行第二條,此時創(chuàng)建的引用變量a還沒指向任何一個對象,它的值是null。引用變量可以指向某個對象,或者為null。它是一根繩,一根還沒有系上任何一個汽球的繩。執(zhí)行了第二句后,一只新汽球做出來了,并被系在a這根繩上。我們抓住這根繩,就等于抓住了那只汽球。再來一句: object a1;就又做了一根繩,還沒系上汽球。如果再加一句: a1= a;系上了。這里,發(fā)生了復(fù)制行為。但是,要說明的是,對象本身并沒有被復(fù)制,被復(fù)制的只是對象引用。結(jié)果是,a1也指向了a所指向的對象。兩根繩系的是同一只汽球。 如果用下句再創(chuàng)建一個對象:a1= new object();則引用變量a1改指向第二個對象。 從以上敘述再推演下去,
我們可以獲得以下結(jié)論:(1)一個對象引用可以指向0個或1個對象(一根繩子可以不系汽球,也可以系一個汽球);(2)一個對象可以有N個引用指向它(可以有N條繩子系住一個汽球)。
如果再來下面語句: a= a1;按上面的推斷,a也指向了第二個對象。這個沒問題。問題是第一個對象呢?沒有一條繩子系住它,它飛了。多數(shù)書里說,它被Java的垃圾回收機制回收了。這不確切。正確地說,它已成為垃圾回收機制的處理對象。至于什么時候真正被回收,那要看垃圾回收機制的心情了。
了解了上面的對象的引用,我們應(yīng)該熟悉對象以及對象的引用了.我們回頭再說第一題
java內(nèi)部提供了幾個類,這些類可以不使用new關(guān)鍵字來初始化,例如: string
上面問題1,可以改成下面的方法
1、

public class Test
{


public static void changeStr(String str)
{

str=new String("welcome");

}


public static void main(String[] args)
{

String str=new String("1234");

changeStr(str);

System.out.println(str);

}

}


通過上面對對象應(yīng)用的理解,就知道原因了.