『壹』 當java父類和子類都有構造函數時,求子類對象初始化過程詳解
你好,初始化過程是這樣的:
1.首先,初始化父類中的靜態成員變數和靜態代碼塊,按照在程序中出現的順序初始化;
2.然後,初始化子類中的靜態成員變數和靜態代碼塊,按照在程序中出現的順序初始化;
3.其次,初始化父類的普通成員變數和代碼塊,在執行父類的構造方法;
4.最後,初始化子類的普通成員變數和代碼塊,在執行子類的構造方法;
最後,給你個例子吧。你運行著幫助理解。
class Super{
public static int a ;
private int b ;
static{
System.out.println("此時a的值為:" + a) ;
a = 10 ;
}
public Super(){
System.out.println("此時a的值為:" + a) ;
System.out.println("此時b的值為:" + b) ;
b = 20 ;
}
{
System.out.println("此時b的值為:" + b);
b = 30 ;
}
}
class Sub extends Super{
public static int aa ;
private int bb ;
static{
System.out.println("此時aa的值為:" + aa) ;
aa = 10 ;
}
public Sub(){
System.out.println("此時aa的值為:" + aa) ;
System.out.println("此時bb的值為:" + bb) ;
bb = 20 ;
}
{
System.out.println("此時bb的值為:" + bb);
bb = 30 ;
}
}
public class ConstructorTest {
public static void main(String[] args) {
new Sub() ;
}
}
『貳』 關於JAVA初始化及初始化順序的問題,謝謝~~
問題1:
在Java中,類裝載器把一個類裝入Java虛擬機中,要經過三個步驟來完成:裝載、鏈接和初始化,其中鏈接又可以分成校驗、准備和解析三步,除了解析外,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:
裝載:查找和導入類或介面的二進制數據;
鏈接:執行下面的校驗、准備和解析步驟,其中解析步驟是可以選擇的;
校驗:檢查導入類或介面的二進制數據的正確性;
//下面這句話很重要
准備:給類的靜態變數分配並初始化存儲空間;
解析:將符號引用轉成直接引用;
初始化:激活類的靜態變數的初始化Java代碼和靜態Java代碼塊。
初始化類中屬性是靜態代碼塊的常用用途,但只能使用一次。
在你補充的例子中,該類沒有被實例化,也就是未被運行,只是被分配了內存空間
問題2:在實例化Insect()時,列印j,此時系統找不到變數j,因為j不是全局變數,而是局部變數,而且定義在後面。
如果改為
Insect(){
int j=39;
System.out.println("i = "+i+", j = "+j);
}
就可以了
變數放在方法外面為該類的全部變數,在所有方法中可用
在方法內定義的變數只能在該方法中使用,而且必須先定義後使用。
『叄』 在基於spring搭建的java web應用中,是通過什麼方式觸發spring的初始化過程的
前段時間在公司做了一個項目,項目用了spring框架實現,WEB容器是Tomct 5,雖然說把項目做完了,但是一直對spring的IoC容器在web容器如何啟動和起作用的並不清楚。所以就抽時間看一下spring的源代碼,藉此了解它的原理。
我們知道,對於使用Spring的web應用,無須手動創建Spring容器,而是通過配置文件,聲明式的創建Spring容器。因此在Web應用中創建Spring容器有如下兩種方式:
1. 直接在web.xml文件中配置創建Spring容器。
2. 利用第三方MVC框架的擴展點,創建Spring容器。
其實第一種方式是更加常見。為了讓Spring容器隨Web應用的啟動而啟動,有如下兩種方式:
1. 利用ServletContextListener實現。
2. 利用load-on-startup Servlet實現。
Spring提供ServletContextListener的一個實現類ContextLoaderListener,該類可以作為Listener 使用,它會在創建時自動查找WEB-INF下的applicationContext.xml文件,因此,如果只有一個配置文件,並且文件名為applicationContext.xml,則只需在web.xml文件中增加以下配置片段就可以了。
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
如果有多個配置文件需要載入,則考慮使用<context-param...>元素來確定配置文件的文件名。ContextLoaderListener載入時,會查找名為contentConfigLocation的初始化參數。因此,配置<context-param...>時就指定參數名為contextConfigLocation。
帶多個配置文件的web.xml文件如下:
<context-param>
<param-name>contextLoaderListener</param-name>
<param-value>
WEB-INF/*.xml, classpath:spring/*.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
多個配置文件之間用「,」隔開。
下面我們來看它的具體實現過程是怎樣的,首先我們從ContextLoaderListener入手,它的代碼如下:
public class ContextLoaderListener implements ServletContextListener
{
private ContextLoader contextLoader;
/**
* 這個方法就是用來初始化web application context的
*/
public void contextInitialized(ServletContextEvent event)
{
this.contextLoader = createContextLoader();
this.contextLoader.initWebApplicationContext(event.getServletContext());
}
/**
* 創建一個contextLoader.
* @return the new ContextLoader
*/
protected ContextLoader createContextLoader()
{
return new ContextLoader();
}
................
}
『肆』 JAVA里初始化是什麼意思
初始化就是給變數一個初始值。
例如:
聲明一個變數:String aa = "abc";int cc =0;其中abc和0就是初始化的值,最後值不一定是abc或者 0加入你覆蓋了aa的值如下:
aa = "def" ; cc=1;那最後aa變數的值就是def,cc變數就是1了,初始化的目的是為了讓變數有值,防止使用時出現異常。
作用
1、遇到new,getstatic,putstatic,或invokestatic這4條位元組碼指令時,如果類沒有進行過初始化,則需要先觸發其初始化。生成這四條指令單最常見的Java代碼場景是:
使用new關鍵字實例化對象的時候,讀取或設置一個類的靜態欄位(被final修飾,已在變異期把結果放入常量池的靜態欄位除外)的時候,以及調用一個類的靜態方法的時候。
2、使用java.lang.reflect包的方法對類進行反射調用的時候,如果類沒有進行過初始化,則需要先出法其初始化。
3、當初始化一個類的時候,如果發現其父類還沒有進行初始化,則需要先出法其父類的初始化。
4、當虛擬機啟動時,用戶需要指定一個要執行的主類(包含main()方法的那個類),虛擬機會先初始化這個主類。
『伍』 java類中構造函數中:數組怎樣初始化
數組一般都是用FOR循環初始化較多吧,如:
for(int i =0;i<array.length;i++){
array[i]=2;
}