2013-05-12 151 views
0

我有一個關於Javascript和Java中的變量聲明的問題。變量被覆蓋

讓我們說在Java中我在我的代碼中聲明一個變量int x = 6;作爲一個全局變量,然後沿着我的方式更改x = 10x變量是否永久替換6個10? 在Javascript中,讓我說我有var area = 6然後我沿着方式更改area = 12作爲一個全局變量,而不是一個本地,在一個函數內。它會被永久覆蓋嗎?

+7

Java和JavaScript是不同的語言。 – Blender 2013-05-12 23:44:00

+3

你可以只寫代碼,運行它,看看會發生什麼... – jlordo 2013-05-12 23:44:03

+0

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html – adaam 2013-05-12 23:45:12

回答

0

是的,他們的目的就是要做到這一點。保持國家。現在,如果你不想改變變量的狀態,你可以很好地在Java上下文中聲明它們final

+0

如果我聲明變量final,然後試圖改變變量的值? – Ralph 2013-05-12 23:46:32

+1

我認爲一個測試用例會是最好的解釋。嘗試一個。 – dmahapatro 2013-05-12 23:47:22

+1

@ user1804697你不能,你的代碼不會編譯。嘗試一下。 – Patashu 2013-05-12 23:47:42

1

int是Java和Javascript中的「原始類型」,並將它們的值存儲在爲其命名的變量中。當您更改變量的int時,該變量內部的值將直接更改。舊的價值不再存在。 (我們稱之爲這種行爲值類型)

但是,對象是不同的,只作爲變量REFERENCE對象 - 並根據對象是可變的(例如Java數組)還是不可變的(例如Java字符串)該對象將改變該對象,使得引用該對象的每個變量都能看到這些變化,或者用這些變化創建一個新對象,從而只有引用新對象的變量才能看到這些變化,這個舊對象永遠是不變的。

0

在你的例子中,簡單的答案是「是」!使用int,該值將被替換。如果您使用字符串,這些是不可變的,這意味着如果您有:

str =「hello」;

Then then on you have:

str =「hello world」;

創建了一個字符串的新實例,而不是被替換的字符串值。實際上你可能看不出有什麼不同。

0

我的經驗主要是用Java,所以在這裏。

在java中,你有原始數據類型和對象。他們倆發生的事情都不一樣。 int是原始數據類型,其包括byteshort,long,float,double,booleanchar。原始類型存儲在堆棧中,而對象則存儲在堆中。這意味着原始類型按原樣存儲,而對象則從堆棧中指向。

這給我帶來了答案。當您重新指定x610時,它會永久更改x。 6被覆蓋。這隻會發生在原始類型中。被更改的對象不會被覆蓋,而舊的對象會被垃圾收集,更多的信息可以在here找到,因爲它超出了問題的範圍。所以你對Java問題的答案是肯定的。

至於javascript,當你創建一個全局變量時,它超出了垃圾回收的範圍。據我所知,JavaScript中的所有東西都是一個對象,即使是原始類型number。每次您更換號碼時,都會在其他地方創建一個新號碼。由於您正在創建一個全局變量,因此您不在垃圾收集中,因此可能會創建一個memory leak until you refresh the page or navigate away from it。但是,不同的引擎可能會有不同的行爲,所以您需要注意這一點。