天天看點

9個問題,帶你掌握流程控制語句中的java原理

摘要:利用9個問題幫助記憶流程控制語句中的Java原理知識。

本文分享自華為雲社群《流程控制語句知識點裡的java原理》,作者:breakDraw 。

相信大家經常會遇到這種問題

9個問題,帶你掌握流程控制語句中的java原理

可是這個知識點是為什麼呢? 我繼續以問題的形式來記憶這個問題中的原理。

Q: 什麼是操作數棧

A:可以了解為jvm做計算時,需要一個臨時的寄存器,把需要計算的資料或者傳方法的參數放到棧中,然後做計算。

9個問題,帶你掌握流程控制語句中的java原理

Q: 什麼是棧幀?

A: 每個線程有一個自己的棧幀,然後運作到每個方法時,每個方法中都會可以了解為是攝影裡的一幀。

9個問題,帶你掌握流程控制語句中的java原理

Q: 棧幀裡包含什麼?

A:

局部變量表

操作數棧

動态連結

方法傳回位址

Q: 棧幀的大小什麼時候确定?

A:在編譯程式代碼的時候

Q: 什麼是局部變量表?

A:每個線程所在棧幀都會有一個自己的局部變量表,裡面存儲方法中使用到的局部變量。

9個問題,帶你掌握流程控制語句中的java原理

Q: 執行個體方法(就是某new出來的對象調用的某個方法)局部變量表的第一個變量是什麼?

A:是this引用。

是以在執行個體方法(即非靜态方法)中調用f()時, 實際上調用的是this.f(), 而這個this就來自局部變量表。

9個問題,帶你掌握流程控制語句中的java原理

PS:

returnAddress類型是為位元組碼指令jsr、jsr_w和ret服務的,它指向了一條位元組碼指令的位址。

局部變量表的容量以變量槽(Slot)為最小機關,32位虛拟機中一個Slot可以存放一個32位以内的資料類型(boolean、byte、char、short、int、float、reference和returnAddress八種)

Q:為什麼java中局部變量沒有預設初始?

A:我的了解,局部變量在局部變量表中,而局部變量表是運作時生成的, 是以沒法在編譯期去生成他的預設初始,是以必須通過指派指令在運作時給他指派。(沒找到很好的解釋,有更好了解的可以幫忙回答一下)

Q:某個方法中執行return a時, 操作數棧和局部變量表會如何變化?

A:a的值會被放到操作數棧的棧頂,後面取傳回值時,就從這裡取(即jvm總得知道傳回值放哪,而return肯定是方法的最後一步操作,于是預設棧頂)

9個問題,帶你掌握流程控制語句中的java原理

Q:在return a之後, 如果在finally操作又對a執行a=2+b, 操作數棧和局部變量表又會如何變化?

A:原先準備傳回的值會被作為局部變量存起來, 接着為了做計算,會取出a和b放到操作數棧中做計算

9個問題,帶你掌握流程控制語句中的java原理

而在finally計算結束後,之前存的傳回值會被放回棧頂。

9個問題,帶你掌握流程控制語句中的java原理

是以,finally裡對傳回變量的修改,無法修改真正的傳回值。

除非在finally裡再執行return操作,這時候就會更改傳回值。

9個問題,帶你掌握流程控制語句中的java原理

點選關注,第一時間了解華為雲新鮮技術~