1. 程式人生 > >JAVA new流程(例項化過程)

JAVA new流程(例項化過程)

1.首先去JVM 的方法區中區尋找類的class物件,如果能找到,則按照定義生成物件,找不到則轉2

2.載入類定義:類載入器(classLoader)尋找該類的 .class檔案,找到後對檔案進行分析轉換為class物件存入方法區方便以後呼叫。

    其中jdk 的class一般是在jvm啟動時用啟動類載入器完成載入,使用者的class則是在用到的時候再載入。

    Java中ClassLoader的載入採用了雙親委託機制,採用雙親委託機制載入類的時候採用如下的幾個步驟:
1.  當前ClassLoader首先從自己已經載入的類中查詢是否此類已經載入,如果已經載入則直接返回原來已經載入的類。
每個類載入器都有自己的載入快取,當一個類被載入了以後就會放入快取,等下次載入的時候就可以直接返回了。
2.  當前classLoader的快取中沒有找到被載入的類的時候,委託父類載入器去載入,父類載入器採用同樣的策略,首先檢視自己的快取,然後委託父類的父類去載入,一直到bootstrp ClassLoader.
3.  當所有的父類載入器都沒有載入的時候,再由當前的類載入器載入,並將其放入它自己的快取中,以便下次有載入請求的時候直接返回。
說到這裡大家可能會想,Java為什麼要採用這樣的委託機制?理解這個問題,我們引入另外一個關於Classloader的概念“名稱空間”, 它是指要確定某一個類,需要類的全限定名以及載入此類的ClassLoader來共同確定。也就是說即使兩個類的全限定名是相同的,但是因為不同的ClassLoader載入了此類,那麼在JVM中它是不同的類。明白了名稱空間以後,我們再來看看委託模型。採用了委託模型以後加大了不同的 ClassLoader的互動能力,比如上面說的,我們JDK本生提供的類庫,比如hashmap,linkedlist等等,這些類由bootstrp 類載入器載入了以後,無論你程式中有多少個類載入器,那麼這些類其實都是可以共享的,這樣就避免了不同的類載入器載入了同樣名字的不同類以後造成混亂。

3.在jvm的堆中給物件開闢一個記憶體空間

4.物件初始化,順序:

(1) 父類靜態物件,靜態程式碼塊

(2)子類靜態物件,靜態程式碼塊

(3)父類非靜態物件,非靜態程式碼塊

(4)父類建構函式

(5)子類非靜態物件,非靜態程式碼塊

(6)子類建構函式

相關推薦

JAVA new流程例項過程

1.首先去JVM 的方法區中區尋找類的class物件,如果能找到,則按照定義生成物件,找不到則轉2 2.載入類定義:類載入器(classLoader)尋找該類的 .class檔案,找到後對檔案進行分析轉換為class物件存入方法區方便以後呼叫。     其中jdk 的cla

Java中建立例項物件的五種方式

Java中建立(例項化)物件的五種方式1、用new語句建立物件,這是最常見的建立物件的方法。 2、通過工廠方法返回物件,如:String str = String.valueOf(23);  3、運用反射手段,呼叫java.lang.Class或者java.lang.r

Java 泛型引數型別

Java 泛型 Java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型提供了編譯時型別安全檢測機制,該機制允許程式設計師在編譯時檢測到非法的型別。  泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。 一. 泛型概念的提出(為什麼需要泛型)? 首先,我們

Java類載入與例項過程

0x00 背景知識 1、虛擬機器在首次載入Java類時,會對靜態初始化塊、靜態成員變數、靜態方法(下文將這三種統稱為靜態程式碼塊)進行一次初始化 具體過程是: ①裝(加)載類的載入指的是將類的.class檔案中的二進位制資料讀入到記

Java面試題系列Java new一個對象的過程中發生了什麽

進行 col over mage 兩個 http system jvm art Person class Person{ private String name; private int age; public Person(

面向物件【day07】:類的例項過程剖析

本節內容 1、概述 2、類的語法 3、總結 一、概述    之前我們說關於python中的類,都一臉懵逼,都想說,類這麼牛逼到底是什麼,什麼才是類?下面我們就來講講,什麼是類?它具有哪些特性。 二、類的語法 2.1 語法

經典String str = new String("abc")記憶體分配問題,研究下字串到底該怎麼樣初始,順便很好的解釋下Java的intern()在文章結尾

大佬這個部落格很厲害,解決了我一直以來的困惑; Java中以下兩句有什麼區別呢?String str1="abc";  String str2=new String("abc"); Java把記憶體劃分成兩種:一種是棧記憶體,一種是堆記憶體。  在函式中定義的一些基本型別

Java基礎之反射例項例項Account與修改屬性

要求:    設計Account類,並且新增屬性id、name、balance,新增get和set方法與存取錢的方法。    設計ReflectAccountTest類,例項化Account物件,存如100元,與取1000元的結果顯示。 &nb

Java——建立例項物件的五種方式

Java中建立(例項化)物件的五種方式 用new語句建立物件,這是最常見的建立物件的方法。 通過工廠方法返回物件,如:String str = String.valueOf(23); 運用反射手段,呼叫java.lang.Class或者java.lang.re

UGui揹包系統例項裝備並且給角色換裝,實現不同的裝備放入相應的人物物品欄中

最近也是跟著玩玩UGUI揹包系統,簡單的寫了一下。希望對初學者有所幫助。 首先就是Unity介面的搭建(這裡我用的是網上找到圖片): 如上圖所示: 隨便找一個遊戲背景圖片(我的是BG),BG下面佈局好Text,內容為“物品欄”,然後在建立一個Image,下面是物品欄裡裡面的裝備

模擬使用者登入獲取cookie/例項session

第一種方法:通過本地瀏覽器儲存的cookie進行登陸 url1 = 'https://passport.cnblogs.com/user/signin?ReturnUrl=https%3A%2F%2Fwww.cnblogs.com%2F' url2 = 'https://www.cnblogs.

java開發流程手動建立和執行流程

JDK : java 開發工具和環境 javac 命令 作用是把原始檔(.java)編譯(翻譯)成位元組碼檔案(.class) java 命令 作用是執行一個java程式 開發java程式的步驟(手動建立) :

動態代理模式例項詳解

簡介 代理模式通常用於達到對原有系統功能進行擴充的目的 比如:你剛接手一個別人沒有完成的專案,這是你不想動別人原理的程式碼,還需要新增新功能。這時代理模式,這時代理模式,這時代理模式會很好的幫助解決問題 代理模式分為兩種: 靜態代理模式 、 動態代理模式 靜態代理 靜態代理一般是

Java使用new和反射例項內部類物件

使用new和反射例項化內部類物件前兩天看到一道面試題,是關於內部類的知識,覺得很有意思,現對其詳細講解,絕對原創!~這道題是這樣的:根據註釋填寫(1),(2),(3)處的程式碼public class Test{public static void main(String[] args){// 初始化Be

Java子父類中的建構函式例項過程

其實我們發現子類繼承父類操作很簡單,如果要是去深入的研究下會發現,例項化過程並非是我們看到的那樣,我們就以程式碼舉例來說明; 問大家,以下程式碼執行會輸出什麼呢? package com.oop; /** * 定義動物物件 * @author

JAVA小專案-銀行管理系統圖形介面3-登入與查詢

還是老規矩 ,先上圖, 得清晰的認識到自己寫到哪了, 還差多少 我們看圖 出了掛失ReportLose和資訊註冊Register 我們不要進行資訊驗證 其他在途中都必須進行 但我為什麼要綜合成一個呢, 因為懶, 覺得寫6個一樣的貼上都感覺很狗 但

java.io.Serializable序列介面詳細總結

一、前言   在參加工作後,做的第一個專案是電商專案。當時不會做專案,只能照貓畫虎。其中一個VO類為何要實現Serializable介面一直沒有理解,不實現這個Serializable,會報錯。如下是隨手寫的一個VO類Person.java: import

依賴注入3靜態工廠例項bean

1.javabean package com.bean; public class Hello {  private String hello;  public String getHello(

java學習筆記碎片

關於java同步鎖的自己的理解:jvm虛擬機器有個執行緒私有的記憶體叫“程式計數器”,是java處理多執行緒時如何記憶上一個執行緒執行的位置的標杆,我們都知道,java多執行緒是類似cpu處理程序那樣,執行緒輪流切換,在一個時刻,一個處理器只處理一個執行緒中指令,程式計數器就

java SSM第三章學習內容oracle儲存過程

儲存過程 edit進入文字編輯器中 /指定語句 DBMS_OUTPUT.PUT_LINE('操作完畢'||a);輸出一段話 commit;提交 set serverout on   列印一段話之前要先設定基本型別 declare      //設定變數,直接賦值可以:=9