摘要:利用9個問題幫助記憶流程控制語句中的Java原理知識。
本文分享自華為雲社群《流程控制語句知識點裡的java原理》,作者:breakDraw 。
相信大家經常會遇到這種問題

可是這個知識點是為什麼呢? 我繼續以問題的形式來記憶這個問題中的原理。
Q: 什麼是操作數棧
A:可以了解為jvm做計算時,需要一個臨時的寄存器,把需要計算的資料或者傳方法的參數放到棧中,然後做計算。
Q: 什麼是棧幀?
A: 每個線程有一個自己的棧幀,然後運作到每個方法時,每個方法中都會可以了解為是攝影裡的一幀。
Q: 棧幀裡包含什麼?
A:
局部變量表
操作數棧
動态連結
方法傳回位址
Q: 棧幀的大小什麼時候确定?
A:在編譯程式代碼的時候
Q: 什麼是局部變量表?
A:每個線程所在棧幀都會有一個自己的局部變量表,裡面存儲方法中使用到的局部變量。
Q: 執行個體方法(就是某new出來的對象調用的某個方法)局部變量表的第一個變量是什麼?
A:是this引用。
是以在執行個體方法(即非靜态方法)中調用f()時, 實際上調用的是this.f(), 而這個this就來自局部變量表。
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肯定是方法的最後一步操作,于是預設棧頂)
Q:在return a之後, 如果在finally操作又對a執行a=2+b, 操作數棧和局部變量表又會如何變化?
A:原先準備傳回的值會被作為局部變量存起來, 接着為了做計算,會取出a和b放到操作數棧中做計算
而在finally計算結束後,之前存的傳回值會被放回棧頂。
是以,finally裡對傳回變量的修改,無法修改真正的傳回值。
除非在finally裡再執行return操作,這時候就會更改傳回值。
點選關注,第一時間了解華為雲新鮮技術~