接觸java也有一年時間了,當初學習java的初衷原本是為了開發android的手機應用。到后來發現java能做的事情還有很多。盡管自己也算獨立做過一個完整的從手機app端到jjavaee服務器端的項目,但后來發現提升越來越困難,歸根結底還是自己對java的理解還不夠深入,只會使用別人寫好的框架,不會自己造輪子。逐漸認識到自己對Java的理解還是很淺薄。為此決定重新學一次java,希望能收獲不一樣的東西。
-
java對象是如何被創建的
我們都知道,java是完全面向對象的語言,不同于面向過程的c語言以及半面向對象的c++,在java中幾乎所有的東西都可以被看作對象,為什么是幾乎呢?因為還有八種基本數據類型,它們不屬于對象。但他們有對應的包裝類型彌補這個缺陷,所以說java完全面向對象也不為過。
-
國際慣例,先來個Hello World壓壓驚。
public class Test { public static void main(String args[]){ String s=new String("Hello World!"); } }
這個栗子簡單的不能在簡單了,但你有清楚這句代碼后面到底做了哪些工作嗎?
- 我們來詳細理解一下,首先 new String("Hello World!")代表了向堆內存中動態申請一塊內存區域,這塊區域用于存儲你創建的對象。那么前面的String s又代表什么意思呢?其是 s 在這里只代表一個引用,這個引用指向了你剛剛申請的這塊內訓區域。就像你剛剛買一臺電視機,你想要換臺,又懶得跑到電視機面前。你就需要一臺遙控器,通過遙控器就可以操控電視機了。這里申請的內存就是電視機,引用其是就是遙控器。
-
了解這些我們再來個復雜點的
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塊,我們來看看運行結果
u1有200
u1有100
u2有100
我們看到u1本來有兩百的,最后也變成的一百。明明后面只對u2進行了操作呀。這就是我們之前說的,u2=u1并不會為u2單獨去堆內存里面申請一塊內存,只是復制了一份u1的引用。就像有人去買了一個和你之前用的一模一樣的遙控器。這樣它也可以操控電視機了。當它把內存中的東西改掉之后,u1的值也會跟著改變的,畢竟u1僅僅就是一個引用而已(這些引用都是放在堆棧之中的)
同理,我們在調用函數的時候也是這樣,函數內部也會幫我們復制一份引用,從而對內存進行操作,但是對本身傳入的引用沒有任何影響。
-
-
了解了這些我們再來談談對象是如何被銷毀的
在java中有個叫做垃圾回收器(Garbage Collection)的東西負責回收沒用的內存。(在C++中這些操作都是要程序員去做的,難怪寫C++的都看不起寫java的,畢竟難度系數就就提升了一個檔次)。由于java申請的內存都是在堆內存中的,所以計算機需要大量的時間花在分配內存上(如果放在堆棧之中的話就會簡單很多了,只需要上下移動堆棧的指針即可)。所以也別怪java的運行效率比c++慢了,畢竟它幫你做了這么工作呢!
-
那么問題來了,什么樣的對象才會被垃圾回收器回收呢?
簡單來說呢,就是當一塊內存不被任何引用指向的時候就會被回收,又有小伙伴問了,什么情況下才會出現這種情況呢,我們來舉個栗子:
public void cool(){ String str=new String(); }
在函數執行完成后str生命周期就結束了,剛剛申請的這塊內存沒有人指向,所以也就沒了。
public class Test { public static void main(String args[]){ new User(); } }
或者像這種,直接new一個對象(當然這沒有什么意義),其它也有很多情況,這里就不一一列舉了,主要因為暫時我也沒想出來。
-
好了,基本也差不多了。初級小菜鳥第一次寫,望各位dalao發現問題及時矯正。更多的當然是希望和大家一起學習,共同進步。