java零基礎入門-面向對象篇(一) 基礎類型和引用類型
友情提示:本章開始可能會有部分較深入的內容,不說又不行,說了又很難解釋清楚,因為裡面的技術細節實在太多太複雜,所以我會屏蔽部分技術細節,只展示當前需要了解的基礎知識,避免出現講了半天還是沒人懂的情況。隨著我們的知識增長,後面會逐步的將細節補充完整。
學習編程,一定要把思路放開,不能太侷限,多多進行思維能力的鍛鍊才能提高自己的內功。比如我們很常見的買房啊,哪裡修商場啊,其實跟我們的內存結構是很類似的。他們都涉及到一個資源規劃的問題,來吧,一起來鍛鍊下思維能力吧。
最近全國除了最火的搶人大戰,其實前段時間還有一個東西很火,那就是城市規劃。比如我們的首都北京,選擇了雄安進行首都功能疏解,其實很多城市都有類似的規劃,比如天津濱海新區,深圳前海新區等等。政府設立了一個即將開發的新區後,會幹嘛?招商引資,首先是大的企業進來修路蓋高樓大廈,然後修住宅,再賣給老百姓。我們來看看具體過程。
首先,政府畫了一個圈,“走過路過不要錯過哈,新鮮出爐的地塊,各種優惠政策,減稅減稅再減稅,快來看看啊~”,然後一堆大企業蜂擁而上,“給我留一塊~”,“我也要~”。然後各種大企業開始修辦公樓啊,房地產開發商開始修海景房啊,然後輪到地產開發商要喝了,“走過路過不要錯過啊,海景房值得擁有,機不可失,搶到了幸福生活,沒搶到繼續幹活~”。然後輪到搶房大軍蜂擁而上了。
給我房!!!
再來看看電腦內存,其實我們的電腦就是政府部門,每一次一開機,就開始要喝,“內存開始大派送啦,需要的快來領啊”,然後各種開機啟動的應用程序開始搶內存,什麼聊天的啊,殺毒的啊,瀏覽器啊,當然還有系統自帶的功能,統統需要內存。當然,內存不是一開機就分完了的,還有很多是我們啟動了新的應用程序才會劃分內存給你,比如我們的java。
應用程序和系統程序佔用內存
電腦開機進行的內存免費大派送跟我們的政府規劃很像,在座的各位都是大佬,內存要多少有多少。然後我們打開java的時候,java也成功的分到了一塊內存空間。java這個房地產商跟別的有點區別,他很牛,拿的地很大,他要自己規劃自己的地,也就是說它不僅僅要做房地產,他還要修商場,建公園,這個就厲害了~
java虛擬機
看見沒有,系統給了一塊內存java ,然後他在自己的一畝三分地上,開始幹自己的規劃了,這是個很高級的房產開發商。java有個名詞叫java虛擬機(JVM),你就可以理解為他是一個虛擬的系統,他幹了很多和系統類似的活,系統把內存交給java以後,就由 jvm 來負責規劃內存。就像我們上面說的,政府部門劃了地給開發商,java自己也劃地分給他下面的小弟。那麼java裡面的小弟又是啥?繼續往下看
首先我們看看普通人眼裡的內存,他就是一塊綠色的板子,上面有很多電路,下面有一條金光閃閃的東西,好了,理解完了。
普通人看內存
再來看看硬件工程師眼裡的內存,他就是各種電路啊,電容啊,門啊之類的東西,其實我也不是很懂,大概是這樣。
硬件工程師看內存
接下來看軟件工程師眼裡的內存,這個圖是指分給java的內存,也就是jvm管理的內存。我們只看java這個開發商,自己已經分到的內存,其他軟件,系統佔用的內存我們不去管他。我們看到 jvm 劃分的內存大概有以下這麼幾個區域:本地方法棧,虛擬機棧,程序計數器,堆,方法區,這些就是 java 自己的小弟了。
jvm內存
我們看看這些顏色是咋回事,和上面的規劃圖顏色說明差不多,紅色的是 堆,可以理解成商業用地,綠色的是方法區,可以理解成公園,這兩個區域的特點是,他們是公共用地,不管哪個小區的居民,都可以來壓壓馬路,看看風景。再看上面的,本地方法棧和程序計數器是灰色,你可以理解為市政設施,每個片區都有警察局,有困難找警察叔叔,我們姑且不去管他,知道就行了。主要看看 虛擬機棧,這個下面簡稱為棧,這個很重要。我們可以理解成居民小區,每個人只能出入自己的小區,去別人小區可不行,保安不讓進。
所以總結一下,堆和方法區是公共的,每個小區的居民都可以去玩,而棧是私有的,不能隨便串門的。這個理解到這裡就行了。接下來我們講講最重要的 棧 和 堆,方法區就是個大草地,暫時不用管他。
基礎類型 和 引用類型
我們首先明確一個觀念,我們的數據都是存在內存裡的,但是不同的數據,在內存中存放的區域是不同的。有的數據存放在棧,有的數據存放在堆。具體誰放在哪,我們首先要明確數據的類型。
基礎類型(又叫值類型):我前面講的都是基礎類型,byte,short,int,long,float,double,boolean,char,基礎類型全部存在棧裡面。
引用類型:數組,類,接口,引用類型變量存在棧,對象存在堆,通過引用確定關係。
基礎類型比較好理解,創建的時候往棧裡面一丟,搞定,打完收工。而引用類型就比較複雜了,引用類型的變量就是引用,啥叫引用?來吧,話不多,懵的時候就上圖
內存地址
好吧,肯定有同學又要問,內存地址又是個啥?
內存地址
地址就是找人找東西時候用的,內存地址就是讓內存劃分的空間有個標記,我通過這個標記可以找到內存。所以引用類型裡面存的不是你定義給他的值,而是存的內存地址。那我定義的數組啊,數組跑哪去了?它在堆裡面,而這個棧裡面存的地址就是堆裡面放的那個數組的地址。又懵了?圖圖圖~
地址
我們將紅色箭頭乾的事,叫做:引用變量指向內存。堆裡面的數據,只有當有引用變量指向它的時候,才能存在,如果沒人指向堆裡面的數據了,就會有一位親切的清潔工阿姨把他當垃圾處理掉。所以棧裡面的變量,紅色箭頭,堆裡面的數據這三個東西是一體的,他們不能分開。他們在一起,才是定義了一個完整的引用類型。
其實這一段對於初學者來說是有難度的,概念比較多,步驟繁瑣,圖也都是平面圖,有沒有更加通俗易懂的方式來解釋這個問題呢,來吧,本教程獨家三維圖雙手奉上。
棧
棧是一種數據結構,他的特點就是先進後出,後進先出。只有棧頂可以操作,棧底是固定的,插入操作又叫入棧,刪除叫出棧。理解這麼多就可以了。
棧結構
入棧
出棧
堆
相對於棧的有序,堆是無序的,可以理解成隨機劃分一塊空間來儲存對象。
堆是無序的
我們用三維圖再來看看剛才的例子
首先是基礎類型
定義變量
入棧
再來看引用類型
定義變量
開闢空間,建立引用
本篇文章為接下來的數組,類打基礎,堆和棧的理解對我們更好的學面向對象很有幫助,請好好理解,多多參悟。
閱讀更多 Java小優秀 的文章