我看還是我來回答吧。 注意了!!Java大蝦到!!
成都創(chuàng)新互聯公司技術團隊10余年來致力于為客戶提供成都網站設計、網站制作、品牌網站建設、成都營銷網站建設、搜索引擎SEO優(yōu)化等服務。經過多年發(fā)展,公司擁有經驗豐富的技術團隊,先后服務、推廣了超過千家網站,包括各類中小企業(yè)、企事單位、高校等機構單位。
首先啊,你要知道Java方法調用都是傳值的,其次要知道基本類型和對象的區(qū)別。
我們來一個個分析你就明白了。
int n=1;
String s="abc";
supper sp=new supper();
這三個量中有一個基本類型,兩個對象對吧?那你知到他們有什么區(qū)別么?
我來簡單的說一下吧。
基本類型很簡單,比如整型n就是四字節(jié)空間,那這個n存在哪里呢?
存在棧里面(因為他是局部變量)。
由于是傳值,那么他就把n的值傳過去了,那邊的形參也是個局部變量,也存在棧里面(f1調用棧),所以本質上main的n1和f1中的n1是倆n1,所以你改變fi中的n1后mian里面的n1顯然不會變。
對象也是傳值?。〔灰f對象是傳引用的,如果你老師這樣叫你那只能說他不真正理解Java內存結構。
對象是什么?或者說s和sp到底是個什么?
我跟你說,他們首先是個局部變量,存在哪里?和n一樣存在main棧里。占多大空間?4個字節(jié)?。?/p>
撒意思?意思就是所謂對象,實質上就是一指針變量?。↗ava語法上沒指針,但Java實現上有的)
指針的內容或說指針指向哪里?指向堆中的兩個對象空間。至于撒是對象空間,我就不細說了,與本問題無關。
所以對象s和sp有兩層含義,一是指兩個局部變量,而是指這兩變量對應的對象空間。
再回到傳值的問題上。
調f2、f3同樣是傳值?。〉驗閟、sp本身就一指針,所以傳的值就是倆對象的內存地址。
好吧,繼續(xù)分析為什么s不變而sp變。
s不變的原因歸結于字符串這個類的特性。不知道你老師告訴過你沒有,字符串是不可變的!不知道也沒關系,我們看看s的處理過程:
s+="def"; 等價于s = s+"def"
s+"def"怎么處理的你知道么?是把def放入s對象空間中么?不是的。
過程是這樣滴:先算出s的長度和def的長度,然后在堆里面開辟一對象空間,之后把s、def都拷進去。而s = s+"def"撒意思呢?那就是考進去之后再把這個新開辟對象的地址放入變量s中去(說過了s是f2的一局部指針類型的變量)。
看看,看看!
main的s把值(對象空間地址)給了f2的s,而你“一不小心”通過s = s+"def"把s中存儲的值換成一個新對象的值了。那么f2的s和main的s還指向同一個對象么???不是的。既然不是的,main的s當然不會變?
現在在看看sp
同里,main的sp把自己存的地址拷貝給f3的sp,而你呢?顯然沒有重新給sp賦值,這也就意味著雖然倆sp是兩個局部變量,但這兩個變量指向的對象空間是一樣滴。
因此,你通過f3的sp操作其成員num,當然會影響main的sp了。
明白了??不明白?我都快累死了你還不明白?去死!
:)
您好,提問者:
java中在內存中劃分:棧內存和堆內存。
1、棧內存:棧中是存放一些定義的變量的引用,比如:int a = 1; a那么就存在棧內存中,java中垃圾回收是JVM幫我們完成的,這里比C大大提高了程序員的繁碎。如果想要控制可以使用System.gc();來通知JVM虛擬機執(zhí)行,但是什么時候執(zhí)行還是由JVM虛擬機來完成的。
2、堆內存:堆中是存放一些比如數組,map類型等。
你可以先用內存監(jiān)控工具,進行監(jiān)控,看看這個功能到底用多少內存。如果不多,其實都不需要實現你說的代碼監(jiān)控的。如果你要使用代碼監(jiān)控,你可是使用Runtime類的幾個屬性,MaxMemory、FreeMemory、TotalMemory。然后實現個線程,在下載pdf功能前開啟線程,然后完畢時關閉線程,如果內存即將溢出(設定個閾值,比如說15%),就報錯,跳轉到錯誤頁面。
使用java.util包中的Stack類創(chuàng)建一個棧對象
public Object push(Object data);輸入數據,實現壓棧
public Object pop();輸出數據,實現彈棧
public boolean empty()判空
public Object peek();查看棧頂元素
可以去查查API嘛
我也是學java的,大家一起進步。