接觸java也有一年時間了珊豹,當(dāng)初學(xué)習(xí)java的初衷原本是為了開發(fā)android的手機應(yīng)用绿映。到后來發(fā)現(xiàn)java能做的事情還有很多盾似。盡管自己也算獨立做過一個完整的從手機app端到j(luò)javaee服務(wù)器端的項目方灾,但后來發(fā)現(xiàn)提升越來越困難,歸根結(jié)底還是自己對java的理解還不夠深入筷狼,只會使用別人寫好的框架,不會自己造輪子匠童。逐漸認(rèn)識到自己對Java的理解還是很淺薄埂材。為此決定重新學(xué)一次java,希望能收獲不一樣的東西汤求。
-
java對象是如何被創(chuàng)建的
我們都知道俏险,java是完全面向?qū)ο蟮恼Z言严拒,不同于面向過程的c語言以及半面向?qū)ο蟮腸++,在java中幾乎所有的東西都可以被看作對象竖独,為什么是幾乎呢裤唠?因為還有八種基本數(shù)據(jù)類型,它們不屬于對象莹痢。但他們有對應(yīng)的包裝類型彌補這個缺陷种蘸,所以說java完全面向?qū)ο笠膊粸檫^。
-
國際慣例竞膳,先來個Hello World壓壓驚航瞭。
public class Test { public static void main(String args[]){ String s=new String("Hello World!"); } }
這個栗子簡單的不能在簡單了,但你有清楚這句代碼后面到底做了哪些工作嗎坦辟?
- 我們來詳細(xì)理解一下刊侯,首先 new String("Hello World!")代表了向堆內(nèi)存中動態(tài)申請一塊內(nèi)存區(qū)域,這塊區(qū)域用于存儲你創(chuàng)建的對象长窄。那么前面的String s又代表什么意思呢滔吠?其是 s 在這里只代表一個引用,這個引用指向了你剛剛申請的這塊內(nèi)訓(xùn)區(qū)域挠日。就像你剛剛買一臺電視機疮绷,你想要換臺,又懶得跑到電視機面前嚣潜。你就需要一臺遙控器冬骚,通過遙控器就可以操控電視機了。這里申請的內(nèi)存就是電視機懂算,引用其是就是遙控器只冻。
-
了解這些我們再來個復(fù)雜點的
public class Test { public static void main(String args[]){ User u1=new User(); u1.setMoney(200); System.out.println("u1有"+u1.getMoney()); User u2=u1; u2.setMoney(100); System.out.println("u1有"+u1.getMoney()); System.out.println("u2有"+u2.getMoney()); } }
-
User是一個只有一個money屬性的類,我們u1是一個有200塊錢的人计技,然后有一個u2和u1一樣它只有100塊喜德,我們來看看運行結(jié)果
u1有200
u1有100
u2有100
我們看到u1本來有兩百的,最后也變成的一百垮媒。明明后面只對u2進(jìn)行了操作呀舍悯。這就是我們之前說的,u2=u1并不會為u2單獨去堆內(nèi)存里面申請一塊內(nèi)存睡雇,只是復(fù)制了一份u1的引用萌衬。就像有人去買了一個和你之前用的一模一樣的遙控器。這樣它也可以操控電視機了它抱。當(dāng)它把內(nèi)存中的東西改掉之后秕豫,u1的值也會跟著改變的,畢竟u1僅僅就是一個引用而已(這些引用都是放在堆棧之中的)
同理观蓄,我們在調(diào)用函數(shù)的時候也是這樣混移,函數(shù)內(nèi)部也會幫我們復(fù)制一份引用祠墅,從而對內(nèi)存進(jìn)行操作,但是對本身傳入的引用沒有任何影響沫屡。
-
-
了解了這些我們再來談?wù)剬ο笫侨绾伪讳N毀的
在java中有個叫做垃圾回收器(Garbage Collection)的東西負(fù)責(zé)回收沒用的內(nèi)存饵隙。(在C++中這些操作都是要程序員去做的撮珠,難怪寫C++的都看不起寫java的沮脖,畢竟難度系數(shù)就就提升了一個檔次)。由于java申請的內(nèi)存都是在堆內(nèi)存中的芯急,所以計算機需要大量的時間花在分配內(nèi)存上(如果放在堆棧之中的話就會簡單很多了勺届,只需要上下移動堆棧的指針即可)。所以也別怪java的運行效率比c++慢了娶耍,畢竟它幫你做了這么工作呢免姿!
-
那么問題來了,什么樣的對象才會被垃圾回收器回收呢榕酒?
簡單來說呢胚膊,就是當(dāng)一塊內(nèi)存不被任何引用指向的時候就會被回收,又有小伙伴問了想鹰,什么情況下才會出現(xiàn)這種情況呢紊婉,我們來舉個栗子:
public void cool(){ String str=new String(); }
在函數(shù)執(zhí)行完成后str生命周期就結(jié)束了,剛剛申請的這塊內(nèi)存沒有人指向辑舷,所以也就沒了喻犁。
public class Test { public static void main(String args[]){ new User(); } }
或者像這種,直接new一個對象(當(dāng)然這沒有什么意義)何缓,其它也有很多情況肢础,這里就不一一列舉了,主要因為暫時我也沒想出來碌廓。
-
好了传轰,基本也差不多了。初級小菜鳥第一次寫谷婆,望各位dalao發(fā)現(xiàn)問題及時矯正慨蛙。更多的當(dāng)然是希望和大家一起學(xué)習(xí),共同進(jìn)步波材。