怎么找到项目中所有同名的类_26岁转行程序员的成长历程--Day03从内存层面理解类和对象...
今天學習了類、對象及相關知識,試著從內存角度分析三者關系,如果有不對的地方請指正
首先得先介紹java中的三個內存區域:
- 棧區
用于存放該線程執行方法的信息(實際參數、局部變量等)。棧屬于線程私有,不能實現線程間的共享。棧的存儲特性是“先進后出,后進先出”。棧是由系統自動分配,速度快!棧是一個連續的內存空間
- 堆區
堆用于存儲創建好的對象和數組(數組也是對象)。JVM只有一個堆,被所有線程共享。 堆是一個不連續的內存空間,分配靈活,速度慢
- 方法區
方法區用來存放程序中永遠不變或唯一的內容,如類、靜態變量、字符創常量等。JVM只有一個方法區,被所有線程共享。方法區實際是堆中的一個區域,只是用于存儲類、常量相關的信息
JVM內存模型package cn.sxt.oo;public class zhihu {public static void main(String[]args) {B b = new B();b.printA();b.printB();}}class B{int a = 0;static int b=0;public void printA() {System.out.println(a);}public static void printB() {System.out.println(b);} }下面來看這一段代碼
1. 類的加載
首先第一步,加載zhihu這一個類,在方法區中存入類信息和類當中的靜態變量、靜態方法和常量。
總結:類的加載是在類第一次被使用的時候,從代碼上看,簡單來說就是類名第一次出現的地方。可以是類的第一個對象創建的時候,也可以是通過 “類名.靜態變量” 調用類中靜態變量的時候。
2.對象創建
完成了class zhihu的加載之后,將會執行main方法,系統會在棧空間中開一個棧幀存放main方法。然后下一句代碼是對象b 的構造方法。但是此時并不馬上執行構造方法。因為class B尚未初始化,因此在生成對象之前會完成class B的初始化。
執行構造方法錢,進行class B的初始化初始化class B后,在堆空間中分配內存用于存放對象 b的信息,執行b中屬性的顯式初始化,并給屬性賦數據類型默認的初始值,如:int a 就賦值0;
執行對象的顯式初始化,并給變量賦默認的初始值完成對象空間的分配,屬性的顯式初始化和初始化賦值之后,才會執行構造方法,此時在棧區中中載入b的構造方法:B b = new B(); 當執行到B b 的時候,main的棧幀中會生成b的局部變量,當執行到new 的時候,將堆中新建的b對象地址賦給棧中的b。
對象初始化之后構造方法會將方法區中的常量賦值給堆中的變量,之后構造方法執行結束,從棧幀中釋放
總結:對象的創建過程為類的初始化、對象空間分配、屬性初始化、執行構造方法并將類中的常量賦值給對象。
非靜態方法的執行
在執行到 b.printA();時,開新棧幀。printA方法會找到main方法中的對象b,根據對象地址找到堆中的printA()方法。然后找到變量a并輸出,執行完成以后該方法的棧幀會被釋放
靜態方法的執行
執行到b.printB();時,也是一樣先開新棧幀。從方法區加載方法p.printB(),然后找到方法區中的靜態變量b,并輸出。
總結:方法的調用本質上就是地址的傳遞,如B b = new B(); 本質上是將新創建的b的地址傳遞給 b;再比如b.printA();即通過b的地址找到printA的方法。當然也可以通過類名去找,如B.printA();
思考:靜態方法中能否調用非靜態方法或非靜態變量
答案顯然是不能的,因為類加載的時候不一定有對象,而非靜態方法和變量只有對象建立之后才有。因此在靜態方法中肯定是沒有非靜態方法或對象的地址的。那么如何實現靜態方法調用非靜態變量呢,只需要提供一個地址即可,我們可以在靜態方法中建立一個對象,通過建立的對象去找到非靜態方法。如以下代碼
public void testPrintA(){B b2 = new B():b2.printA(); }思考:類與類之間能否互相調用
非靜態方法肯定是要實例化以后通過 對象名.方法名/變量名 去調用
而靜態方法是可以互相調用的,用類名.方法名/變量名 或者 對象名.方法名/變量名調用
class A{ B b;public void printB1(){ B.printB(); } public void printB2(b){b.printB();} }思考:this關鍵字的本質——指向當前對象
this關鍵字的用法:
- 構造器中用于區分同名的局部變量和成員變量
局部變量是方法執行時存放在棧中的,與成員變量生重名時,this就可以指向堆中的成員變量,這樣就區分開了。
- 構造器中調用另一個構造器
總結
以上是生活随笔為你收集整理的怎么找到项目中所有同名的类_26岁转行程序员的成长历程--Day03从内存层面理解类和对象...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ideaspringboot项目上传服务
- 下一篇: python网易云_用python爬虫爬