2 回答

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

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