新聞中心
java 中靜態(tài)代碼和非靜態(tài)代碼塊的區(qū)別!
相同點(diǎn):都是在JVM加載類時(shí)且在構(gòu)造方法執(zhí)行之前執(zhí)行,在類中都可以定義多個(gè),
成都創(chuàng)新互聯(lián)公司專注于和田網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供和田營銷型網(wǎng)站建設(shè),和田網(wǎng)站制作、和田網(wǎng)頁設(shè)計(jì)、和田網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造和田網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供和田網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
一般在代碼塊中對一些static變量進(jìn)行賦值。
不同點(diǎn):靜態(tài)代碼塊在非靜態(tài)代碼塊之前執(zhí)行(靜態(tài)代碼塊—非靜態(tài)代碼塊—構(gòu)造方法)。
靜態(tài)代碼塊只在第一次new執(zhí)行一次,之后不再執(zhí)行,而非靜態(tài)代碼塊在每new
一次就執(zhí)行一次。非靜態(tài)代碼塊可在普通方法中定義(不過作用不大);而靜態(tài)代碼塊不行。
例:
//普通類
public class PuTong {
public PuTong(){
System.out.print("默認(rèn)構(gòu)造方法!--");
}
//非靜態(tài)代碼塊
{
System.out.print("非靜態(tài)代碼塊!--");
}
//靜態(tài)代碼塊
static{
System.out.print("靜態(tài)代碼塊!--");
}
public static void test(){
{
System.out.println("普通方法中的代碼塊!");
}
}
}
//測試類
public class TestClass {
/**
* 區(qū)別兩次new靜態(tài)與非靜態(tài)代碼塊執(zhí)行情況
*/
public static void main(String[] args) {
PuTong c1 = new PuTong();
c1.test();
PuTong c2 = new PuTong();
c2.test();
}
}
/*
運(yùn)行輸出結(jié)果是:
靜態(tài)代碼塊!--非靜態(tài)代碼塊!--默認(rèn)構(gòu)造方法!--普通方法中的代碼塊!
非靜態(tài)代碼塊!--默認(rèn)構(gòu)造方法!--普通方法中的代碼塊!
*/
java代碼的非順序執(zhí)行是什么意思
靜態(tài)代碼塊執(zhí)行錯(cuò)誤。
1、java代碼的非順序執(zhí)行意思就是靜態(tài)代碼塊執(zhí)行錯(cuò)誤。
2、在執(zhí)行java代碼時(shí),在執(zhí)行靜態(tài)代碼塊的時(shí)候操作失誤就會產(chǎn)生這個(gè)問題。
JAVA 靜態(tài)代碼塊和非靜態(tài)代碼塊 作用?
靜態(tài)代碼塊是在類加載進(jìn)jvm時(shí)類實(shí)例化之前運(yùn)行的,比如業(yè)務(wù)場景有這種類初始化時(shí)需要加載許多資源,在運(yùn)行實(shí)例化類的時(shí)候會影響程序響應(yīng)時(shí)間,所以就在項(xiàng)目啟動的時(shí)候加載類的時(shí)候就初始化了.非靜態(tài)代碼塊是在類實(shí)例化的時(shí)候才會運(yùn)行,所以靜態(tài)代碼塊的執(zhí)行一定在非靜態(tài)代碼塊執(zhí)行之前執(zhí)行.至于你上面的第一個(gè)問題要看具體業(yè)務(wù)場景和需求,賦值都可以實(shí)現(xiàn).第二個(gè)問題,可能是寫那句代碼的人要看程序加載后有沒有執(zhí)行那部分代碼而加上的,知道了靜態(tài)代碼塊和非靜態(tài)代碼塊的本質(zhì)區(qū)別,為什么那么做和目的你就應(yīng)該知道了.
java 繼承父類 是會先執(zhí)行父類嗎
java中子類繼承父類程序執(zhí)行順序問題
Java中,new一個(gè)類的對象,類里面的靜態(tài)代碼塊、非靜態(tài)代碼、無參構(gòu)造方法、有參構(gòu)造方法、類的一般方法等部分,它們的執(zhí)行順序相對來說比較簡單,用程序也很容易驗(yàn)證。比如新建一個(gè)測試父類。
public class FatherTest {
private String name;
FatherTest(){
System.out.println("--父類的無參構(gòu)造函數(shù)--");
}
FatherTest(String name){
this.name=name;
System.out.println("--父類的有參構(gòu)造函數(shù)--"+this.name);
}
static{
System.out.println("--父類的靜態(tài)代碼塊--");
}
{
System.out.println("--父類的非靜態(tài)代碼塊--");
}
public void speak(){
System.out.println("--父類的方法--");
}
}
加入一個(gè)main程序后
public static void main(String[] args) {
System.out.println("--父類主程序--");
FatherTest father=new FatherTest("父親的名字");
father.speak();
}
執(zhí)行結(jié)果為:
--父類的靜態(tài)代碼塊--
--父類主程序--
--父類的非靜態(tài)代碼塊--
--父類的有參構(gòu)造函數(shù)--父親的名字
--父類的方法—
可以很明顯的看出來執(zhí)行順序:靜態(tài)代碼塊—主程序—非靜態(tài)代碼塊—構(gòu)造函數(shù)—一般方法。
如果加入子類的繼承以后,情況就會變得復(fù)雜些。比如我們再新建一個(gè)測試子類。
public class SonTest extends FatherTest {
private String name;
static{
System.out.println("--子類的靜態(tài)代碼塊--");
}
{
System.out.println("--子類的非靜態(tài)代碼塊--");
}
SonTest(){
System.out.println("--子類的無參構(gòu)造函數(shù)--");
}
SonTest(String name){
this.name=name;
System.out.println("--子類的有參構(gòu)造函數(shù)--"+this.name);
}
@Override
public void speak(){
System.out.println("--子類Override了父類的方法--");
}
}
然后再加入一個(gè)main函數(shù)
public static void main(String[] args) {
System.out.println("--子類主程序--");
FatherTest father=new FatherTest("父親的名字");
father.speak();
SonTest son=new SonTest("兒子的名字");
son.speak();
}
執(zhí)行結(jié)果為:
--父類的靜態(tài)代碼塊--
--子類的靜態(tài)代碼塊--
--子類主程序--
--父類的非靜態(tài)代碼塊--
--父類的有參構(gòu)造函數(shù)--父親的名字
--父類的方法--
--父類的非靜態(tài)代碼塊--
--父類的無參構(gòu)造函數(shù)--
--子類的非靜態(tài)代碼塊--
--子類的有參構(gòu)造函數(shù)--兒子的名字
--子類Override了父類的方法--
加入了子類以后,執(zhí)行順序有了新的變化,我們可以總結(jié)一下。首先第一部分執(zhí)行的是父類的靜態(tài)代碼塊—子類的靜態(tài)代碼塊—主程序。這一部分都是執(zhí)行一次,與建立多少對象沒有關(guān)系。第二部分new了一個(gè)父類對象,并調(diào)用了方法。執(zhí)行了它的非靜態(tài)代碼塊—構(gòu)造函數(shù)—一般方法。第三部分new了一個(gè)子類的對象,并調(diào)用了方法。執(zhí)行順序?yàn)楦割惖姆庆o態(tài)代碼塊—父類的無參構(gòu)造函數(shù),然后是子類的非靜態(tài)代碼塊—子類構(gòu)造函數(shù)—子類的方法。
分享文章:java非靜態(tài)代碼塊執(zhí)行 java中靜態(tài)代碼塊
網(wǎng)站網(wǎng)址:http://fisionsoft.com.cn/article/docdosh.html