2 回答

TA貢獻1816條經(jīng)驗 獲得超6個贊
Java 語言不允許您像 C 和 C++ 那樣在代碼中區(qū)分堆/堆棧。
相反,它將所有數(shù)據(jù)類型分為兩組:
基本類型:
這些是簡單的內(nèi)置數(shù)字類型,例如int
,double
或boolean
(不是 Java 中的數(shù)字類型)。
注意String
不是這樣的類型!對象類型:
如果是類,那么它就是對象類型。這適用于內(nèi)置類型(例如)String
和用戶定義類型(例如您的Stream
類)。
對于這些類型,您看到的只是引用,無論您查看的是局部變量、類成員、實例成員還是函數(shù)參數(shù)。
讓我們看一個簡單的例子:
public class A {
? ? public int a;
? ? public static void main(String [] args) {
? ? ? ? A var1 = new A();
? ? ? ? A var2 = var1;
? ? ? ? var1.a = 42;
? ? ? ? System.out.println("var2.a = " + var2.a);
? ? }
}
如果編譯并運行這個示例,它將打印 42。
在 C++ 中,該行將A var2 = var1;
調(diào)用復制構(gòu)造函數(shù)并創(chuàng)建一個新對象,但在 Java 中沒有這樣的事情。如果你想要一個副本,你需要clone
顯式調(diào)用方法。
保存var1
和復制的內(nèi)容var2
只是一個參考。所以兩個變量“指向”同一個對象。
再說一遍——課程是否瑣碎并不重要。即使一個類完全是空的,您仍然只能獲得并使用對該類的任何對象的引用。
至于前面提到的基本類型,Java 有諸如Integer
和Boolean
for 它們的包裝類。您可能想閱讀有關(guān)“裝箱”和“拆箱”的內(nèi)容。
還要注意的另一件事是,某些類型是不可變的 - 也就是說,它們不提供在創(chuàng)建后更改數(shù)據(jù)的方法。
String
在Java中是一種不可變類型,但它也與任何其他類型有所不同。
它有特殊的特權(quán)。
雖然 Java 不像 C++ 那樣支持運算符重載,但對于String
類型,該語言確實提供了一種特殊的方法+ operator
來執(zhí)行字符串連接。
然而,由于String
對象是不可變的,任何串聯(lián)操作都會創(chuàng)建一個全新的String
對象,甚至是這樣的:
String?a?=?"Hello"; a?=?a?+?"?world!";
這將創(chuàng)建一個新字符串“Hello world”并將對其的引用存儲在 中a
,而對舊“Hello”字符串的引用將在將來的某個時刻被垃圾收集。

TA貢獻2011條經(jīng)驗 獲得超2個贊
盡管在 Java 中一切都是按值傳遞的,但是原始數(shù)據(jù)類型(例如 int、char 和 boolean)與引用數(shù)據(jù)類型傳遞給方法的方式之間存在差異。當傳遞原始數(shù)據(jù)類型的值時,該值只能在特定方法的范圍內(nèi)更改。當傳遞引用數(shù)據(jù)類型的值時,引用將保持不變,但值將全局更改(或在對象初始化的任何范圍內(nèi))。
添加回答
舉報