摘要:的垃圾回收機制是由一條后臺線程執行的,其本身也是非常消耗內存的,因此,濫用創建對象,會導致性能大大下降,對內存的分配的了解就顯得尤為重要變量分類局部變量形參存在于方法簽名中定義的局部變量,有方法調用者為其賦值,隨著方法的結束而消亡方法內部變
JVM的垃圾回收機制是由一條后臺線程執行的,其本身也是非常消耗內存的,因此,濫用創建對象,會導致性能大大下降,對內存的分配的了解就顯得尤為重要
變量分類 局部變量形參:存在于方法簽名中定義的局部變量,有方法調用者為其賦值,隨著方法的結束而消亡
方法內部變量:在方法內部定義的局部變量,必須在方法內對其進行顯示初始化,隨著方法的結束而消亡
代碼塊內部的局部變量:在代碼塊內定義的局部變量,必須在代碼塊內對其顯式初始化,隨著代碼塊結束而消亡
成員變量實例變量:非靜態的成員變量,隨著對象的產生,進行初始化等操作,對象結束變量也就消亡
類變量:靜態的成員變量,帶有static修飾符,隨著類初始化產生,隨著類消失而消失
變量的內存分配在創建變量的時候,一定要合法的前向引用。其含義就是先定義的變量不能引用后定義的變量,反之則可以
在同一個JVM中每一個類只會存在一個Class對象,因此JVM只要分配一塊內存空間給類變量就可以了,而實例變量則每次創建對象都要為其分配一塊內存,幾個實例就要創建幾塊內存空間
實例變量的初始化時機定義變量的時候
代碼塊中
構造器中
類變量初始化時機定義實例變量時指定的初始值、初始化塊中為實例變量指定初始值的語句的地位是平等的,當經過編譯器處理后,他們都將被提取到構造器中,也就是說在編譯后,初始化都會被放在構造器中按先后順序進行初始化賦值
同一個JVM中,類變量只能初始化一次
定義變量的時候
靜態代碼塊
父類構造器在創建Java對象的時候,都會先去執行該類的父類對象的非靜態代碼塊和構造器,最后才是該類的非靜態代碼塊和構造器
所謂的隱式調用和顯式調用,其實就是有沒有用super去調用父類的構造器的區別。
如果父類還沒被初始化過,則會最先對類變量進行初始化
訪問子類對象的實例變量子類的方法可以訪問父類的實例變量,這是因為子類繼承父類就會獲得父類的成員變量和方法,但父類的方法不能訪問子類的實例變量,因為父類無法知道哪個子類繼承他
而且子父類中的成員變量(類變量和實例變量)是相互獨立的,父類中的成員變量不會被子類中同名的變量覆蓋
class Base { static int count = 2; } class Mid extends Base { static int count = 20; } public class Sub extends Mid { static int count = 200; public static void main(String[] args) { // 創建一個Sub對象 Sub s = new Sub(); // 將Sub對象向上轉型后賦為Mid、Base類型的變量 Mid s2m = s; Base s2b = s; // 分別通過3個變量來訪問count實例變量 System.out.println(s.count); System.out.println(s2m.count); System.out.println(s2b.count); } }
結果
200
20
2
訪問子類對象的方法當創建Sub的時候,會初始化Base、Mid和Sub三個對象,同時也就存在三個count變量了,也就是說有三塊內存保存著這三個對象和count變量,以s2m變量為例,s2m擁有的地址是Sub對象的堆地址,但s2m變量類是是Mid,則會去尋找Mid下的變量值
也就說成員變量的值取決于聲明該變量聲明時是所用的類型
子類可以重寫父類的方法,子類也可以通過super的方式調用父類的方法,在多態的情況下,子類重寫的方法會覆蓋掉父類的方法
class Base{ int count =2; public void display(){ System.out.println(this.count); } } class Derived extends Base{ int count =20; @Override public void display() { System.out.println(this.count); } } public class FieldAndMethod { public static void main(String[] args) { Base b=new Base(); System.out.println(b.count); b.display(); Derived d=new Derived(); System.out.println(d.count); d.display(); Base db=new Derived(); System.out.println(db.count); db.display(); Base b2d=d; System.out.println(b2d.count); } }
結果
2
2
20
20
2
20
2
一切在你執行這段代碼之后,你就會明白一切了。
更多內容可以關注微信公眾號,或者訪問AppZone網站
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65983.html
摘要:之前一篇文章我們詳細說明了變量對象,而這里,我們將詳細說明作用域鏈。而的作用域鏈,則同時包含了這三個變量對象,所以的執行上下文可如下表示。下圖展示了閉包的作用域鏈。其中為當前的函數調用棧,為當前正在被執行的函數的作用域鏈,為當前的局部變量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初學JavaScrip...
摘要:查找原因因為更新了的版本才出現內存泄漏的問題,所以有理由懷疑,就是新增加的功能導致的內存泄漏。同時還發現了也有內存泄漏的情況,通過同樣的方式定位到了這個問題并最終解決。 在最近給客戶交付的一個項目中,客戶反映系統跑一段時間就會奔潰掉。我的第一直覺就是可能發生了內存泄漏。 復現bug 為了能夠讓bug復現,我讓開發的小伙,先把模擬系統在本地跑起來。要知道,bug復現是很重要的。bug復現...
摘要:友情提示先關注收藏,再查看,萬字保姆級語言從入門到精通教程。及大牛出天地開始有隨之乃有萬種語年英國劍橋大學推出了語言。 友情提示:先關注收藏,再查看,13 萬字保...
摘要:展示如下場景再現經過分析,最后我們定位到是使用產生的內存泄露問題。下面通過一個,來簡單講下具體內存泄露的原因。這一次的內存泄露問題算是解決了。總結關于內存泄露問題在第一次排查時,往往是有點不知所措的。 記一次 JAVA 的內存泄露分析 摘要:本文屬于原創,歡迎轉載,轉載請保留出處:https://github.com/jasonGeng88/blog 當前環境 jdk == 1.8 ...
摘要:主題來自于的典型面試問題列表。有多種方法來處理事件委托。這種方法的缺點是父容器的偵聽器可能需要檢查事件來選擇正確的操作,而元素本身不會是一個監聽器。 showImg(http://fw008950-flywheel.netdna-ssl.com/wp-content/uploads/2014/11/Get-Hired-Fast-How-to-Job-Search-Classifieds...
閱讀 2871·2021-10-14 09:43
閱讀 1658·2021-09-29 09:34
閱讀 1744·2021-07-28 00:16
閱讀 2964·2019-08-30 15:53
閱讀 2905·2019-08-30 13:59
閱讀 2961·2019-08-30 13:57
閱讀 1091·2019-08-26 13:38
閱讀 1893·2019-08-26 13:25