电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

分析Java中的類加載問題

瀏覽:52日期:2022-08-09 18:10:05
目錄一、Java類的加載順序二、類加載過程三、被動引用中和類靜態初始化的關系四、類加載器雙親委派一、Java類的加載順序

引用1個網上的經典例子,并做稍許改動,以便大家更好地理解。

public class Animal { private int i = test(); private static int j = method(); static {System.out.println('a'); } Animal(){System.out.println('b'); } {System.out.println('c'); } public int test(){System.out.println('d');return 1; } public static int method(){System.out.println('e');return 1; }}public class Dog extends Animal{ {System.out.println('h'); } private int i = test(); static {System.out.println('f'); } private static int j = method(); Dog(){System.out.println('g'); } public int test(){System.out.println('i');return 1; } public static int method(){System.out.println('j');return 1; } public static void main(String[] args) {Dog dog = new Dog();System.out.println();Dog dog1 = new Dog(); }}

執行這段main程序,會輸出什么?

答案是

eafjicbhigicbhig

為了方便大家一個個細節去理解, 我換一種方式去提問。

Q: 什么時候會進行靜態變量的賦值和靜態代碼塊的執行?

A:

第一次創建某個類或者某個類的子類的實例 訪問類的靜態變量、調用類的靜態方法 使用反射方法forName 調用主類的main方法(本例子的第一次靜態初始化其實屬于這個情況,調用了Dog的main方法)

注: 類初始化只會進行一次, 上面任何一種情況觸發后,之后都不會再引起類初始化操作。

Q:初始化某個子類時,也會對父類做靜態初始化嗎?順序呢?

A:如果父類之前沒有被靜態初始化過,那就會進行, 且順序是先父類再子類。 后面的非靜態成員初始化也是如此。所以會先輸出eafj。

Q: 為什么父類的method不會被子類的method重寫?

A: 靜態方法是類方法,不會被子類重寫。畢竟類方法調用時,是必定帶上類名的。

Q: 為什么第一個輸出的是e而不是a?

A: 因為類變量的顯示賦值代碼和靜態代碼塊代碼按照從上到下的順序執行。

Animal的靜態初始化過程中,method的調用在static代碼塊之前,所以先輸出e再輸出a。

而Dog的靜態初始化過程中,method的調用在static代碼塊之后,因此先輸出f,再輸出j

Q: 沒有在子類的構造器中調用super()時,也會進行父類對象的實例化嗎?

A: 會的。會自動調用父類的默認構造器。 super()主要是用于需要調用父類的特殊構造器的情況。因此會先進行Animal的對象實例化,再進行Dog的對象實例化

Q: 構造方法、成員顯示賦值、非靜態代碼塊(即輸出c和h的那2句)的順序是什么?

A:

1.成員顯示賦值、非靜態代碼塊(按定義順序)

2.構造方法

因此Animal的實例化過程輸出icb(如果對輸出i有疑問,見下面一題)接著進行Dog的實例化,輸出hig

Q: 為什么Animal實例化時, i=test()中輸出的是i而不是d?

A:因為你真正創建的是Dog子類,Dog子類中的test()方法由于簽名和父類test方法一致,因此test方法被重寫了。此時即使在父類中調用,也還是用使用子類Dog的方法。除非你new的是Animal。

Q: 同上題, 如果test方法都是private或者final屬性, 那么上題的情況會有變化嗎??

A:

因為private和final方法是不能被子類重寫的。所以Animal實例化時,i=test輸出d。

總結一下順序:

1.父類靜態變量顯式賦值、父類靜態代碼塊(按定義順序)

2.子類靜態變量顯式賦值、子類靜態代碼塊(按定義順序)

3.父類非靜態變量顯式賦值(父類實例成員變量)、父類非靜態代碼塊(按定義順序)

4.父類構造函數

5.子類非靜態變量(子類實例成員變量)、子類非靜態代碼塊(按定義順序)

6.子類構造函數。

二、類加載過程

Q:類加載的3個必經階段是:

A:

1.加載(類加載器讀取二進制字節流,生成java類對象)

2.鏈接(驗證,分配靜態域初始零值)

3.初始化(前面的題目講的其實就是初始化時的順序)

更詳細的如下:

分析Java中的類加載問題

三、被動引用中和類靜態初始化的關系

Q:new某個類的數組時,會引發類初始化嗎?

像下面輸出什么

public class Test { static class A{public static int a = 1;static{ System.out.println('initA');} } public static void main(String[] args) {A[] as = new A[5]; }}

A:

new數組時,不會引發類初始化。什么都不輸出。

Q:引用類的final靜態字段,會引發類初始化嗎?

像下面輸出什么?

public class Test { static class A{public static final int a = 1;static{ System.out.println('initA');} } public static void main(String[] args) {System.out.println('A.a=' + A.a); }}

A: 不會引發。

不會輸出initA。 去掉final就會引發了。(注意這里必須是基本類型常量, 如果是引用類型產量,則會引發類初始化)

Q:子類引用了父類的靜態成員,此時子類會做類初始化嘛?

如下會輸出什么

public class Test { static class A{public static int a = 1;static{ System.out.println('initA');} } static class B extends A{static { System.out.println('initB');} } public static void main(String[] args) {System.out.println('B.a=' + B.a); }}

A:

子類不會初始化。打印initA,卻不會打印initB。

四、類加載器雙親委派

類加載時的雙親委派模型,不知道能怎么出題。。。反正就記得優先去父類加載器中看類是否能加載。

分析Java中的類加載問題

Bootsrap不是ClassLoader的子類,他是C++編寫的。而ExtClassLoader和AppClassLoader都是繼承自ClassLoader的

Q:java中, 是否類和接口的包名和名字相同, 那么就一定是同一個類或者接口?

A:錯誤。

1個jvm中, 類和接口的唯一性由二進制名稱以及它的定義類加載器共同決定。因此2個不同的加載器加載出來相同的類或接口時, 實際上是不同的。

以上就是分析Java中的類加載問題的詳細內容,更多關于Java 類加載的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 代理记账_公司起名核名_公司注册_工商注册-睿婕实业有限公司 | 权威废金属|废塑料|废纸|废铜|废钢价格|再生资源回收行情报价中心-中废网 | 耐酸泵,耐腐蚀真空泵,耐酸真空泵-淄博华舜耐腐蚀真空泵有限公司 精密模具-双色注塑模具加工-深圳铭洋宇通 | 小程序开发公司-小程序制作-微信小程序开发-小程序定制-咏熠软件 | 上海防爆真空干燥箱-上海防爆冷库-上海防爆冷柜?-上海浦下防爆设备厂家? | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 高空重型升降平台_高空液压举升平台_高空作业平台_移动式升降机-河南华鹰机械设备有限公司 | 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 卧涛科技有限公司科技项目申报公司|高新技术企业申报|专利申请 | 番茄畅听邀请码怎么输入 - Dianw8.com | 定做大型恒温循环水浴槽-工业用不锈钢恒温水箱-大容量低温恒温水槽-常州精达仪器 | IP检测-检测您的IP质量 | 脉冲布袋除尘器_除尘布袋-泊头市净化除尘设备生产厂家 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 新能源汽车电机定转子合装机 - 电机维修设备 - 睿望达 | 威实软件_软件定制开发_OA_OA办公系统_OA系统_办公自动化软件 | 美国HASKEL增压泵-伊莱科elettrotec流量开关-上海方未机械设备有限公司 | 聚丙烯酰胺PAM-聚合氯化铝PAC-絮凝剂-河南博旭环保科技有限公司 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 生态板-实木生态板-生态板厂家-源木原作生态板品牌-深圳市方舟木业有限公司 | 小学教案模板_中学教师优秀教案_高中教学设计模板_教育巴巴 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | Honsberg流量计-Greisinger真空表-气压计-上海欧臻机电设备有限公司 | LZ-373测厚仪-华瑞VOC气体检测仪-个人有毒气体检测仪-厂家-深圳市深博瑞仪器仪表有限公司 | 撕碎机_轮胎破碎机_粉碎机_回收生产线厂家_东莞华达机械有限公司 | 十二星座查询(性格特点分析、星座运势解读) - 玄米星座网 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 快速卷帘门_硬质快速卷帘门-西朗门业 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 电磁流量计_智能防腐防爆管道式计量表-金湖凯铭仪表有限公司 | 滑板场地施工_极限运动场地设计_滑板公园建造_盐城天人极限运动场地建设有限公司 | 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 丽陂特官网_手机信号屏蔽器_Wifi信号干扰器厂家_学校考场工厂会议室屏蔽仪 | 承插管件_不锈钢承插管件_锻钢高压管件-温州科正阀门管件有限公司 | 学生作文网_中小学生作文大全与写作指导| 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 不锈钢丸厂家,铝丸,铸钢丸-淄博智源铸造材料有限公司 | 威实软件_软件定制开发_OA_OA办公系统_OA系统_办公自动化软件 | 天津中都白癜风医院_天津白癜风医院_天津治疗白癜风 |