日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

怎么找到项目中所有同名的类_26岁转行程序员的成长历程--Day03从内存层面理解类和对象...

發布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怎么找到项目中所有同名的类_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从内存层面理解类和对象...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。