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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java实例化后自动执行_Java的实例化顺序(程序执行顺序)

發(fā)布時(shí)間:2024/8/23 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java实例化后自动执行_Java的实例化顺序(程序执行顺序) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

加載/執(zhí)行順序:

牢記一點(diǎn):

靜態(tài)和非靜態(tài)分開(kāi)處理

使用到靜態(tài)加載時(shí),靜態(tài)又分為: 靜態(tài)變量, 靜態(tài)代碼塊, 其中加載順序是按照類中書(shū)寫的先后順序加載的

非靜態(tài)加載順序: 按照非靜態(tài)書(shū)寫順序加載/執(zhí)行

靜態(tài)方法,實(shí)例方法只有在調(diào)用的時(shí)候才會(huì)去執(zhí)行

當(dāng)靜態(tài)加載中遇到需要加載非靜態(tài)的情況: 先加載非靜態(tài)再加載靜態(tài)。

下面兩種情況的加載順序

不涉及到父類子類的情況:

1) 首先將所有靜態(tài)成員變量加載進(jìn)來(lái), 但是不賦值,JVM會(huì)根據(jù)屬性的數(shù)據(jù)類型第一時(shí)間賦默認(rèn)值

2)然互再進(jìn)行賦值,即加載靜態(tài)變量一一為分配內(nèi)存賦值,靜態(tài)變量,靜態(tài)塊的加載,沒(méi)有優(yōu)先級(jí)之分,按照書(shū)寫先后順序加載

特殊情況: 靜態(tài)變量是加載類本生的實(shí)例,會(huì)比較麻煩,稍后講解

涉及到父類的情況

父靜態(tài)-->子靜態(tài)? 加載時(shí)不涉及構(gòu)造方法,只有使用都new才會(huì)涉及到構(gòu)造方法

下面將具體講述程序執(zhí)行順序

1. main第一句是否先執(zhí)行

Java程序運(yùn)行時(shí),第一件事情就是試圖訪問(wèn)main方法,因?yàn)閙ain相等于程序的入口,如果沒(méi)有main方法,程序?qū)o(wú)法啟動(dòng),main方法更是占一個(gè)獨(dú)立的線程,找到main方法后,是不是就會(huì)執(zhí)行mian方法塊里的第一句話呢?不是

因?yàn)閙ain方法雖然是一個(gè)特殊的靜態(tài)方法,但是還是靜態(tài)方法,此時(shí)JVM會(huì)加載main方法所在的類,試圖找到類中其他靜態(tài)部分,即首先會(huì)找main方法所在的類。

public class JVMTest {

static{

System.out.println("Main 方法所在靜態(tài)代碼塊 static1");

}

public static void main(String[] args) {

System.out.println("main start");

A a = new A();

System.out.println(A.width);

System.out.println(a.width);

}

static{

System.out.println("Main 方法所在靜態(tài)代碼塊 static2");

}

}

class A{

public static int width = 100;

static{

System.out.println("靜態(tài)初始化類A");

width = 30;

}

public A(){

System.out.println("創(chuàng)建A類的對(duì)象");

}

}

結(jié)果

Main 方法所在靜態(tài)代碼塊 static1

Main 方法所在靜態(tài)代碼塊 static2

main start

靜態(tài)初始化類A

創(chuàng)建A類的對(duì)象

30

30

上例中: 先找到main方法, 然后先加載main 方法所在的類JVMTest的靜態(tài)屬性, 靜態(tài)代碼塊(按照順序加載),即使靜態(tài)代碼塊在main方法下面也要先加載靜態(tài)代碼塊。然后執(zhí)行 main方法

2. 靜態(tài)變量聲明一定放在使用前面

3. 父類,子類加載順序

public class JVMParent {

public static int width = 100;

public static int count;

{

System.out.println("parent no static code block :" + count);

}

static{

System.out.println("parent static's count:" + count);

}

JVMParent(int a){

System.out.println("parent init one parameter");

}

JVMParent(){

System.out.println("parent init");

}

}

public class JVMSon extends JVMParent {

{

System.out.println("son no static code block :" + count);

}

static {

System.out.println("son static 1");

}

public static int count1;

JVMSon() {

System.out.println("son init:" + count);

}

static {

System.out.println("son static 2");

}

public static void main(String[] args) {

System.out.println("son main start");

JVMSon a = new JVMSon();

}

}

結(jié)果

parent static's count:0

son static 1

son static 2

son main start

parent no static code block :0

parent init

son no static code block :0

son init:0

執(zhí)行順序:

1)加載Main方法, 先要加載包含Main方法的類, 加載類就先加載父類靜態(tài)變量, 靜態(tài)代碼塊(按照書(shū)寫先后順序)--》 子類靜態(tài)變量,靜態(tài)代碼塊

2) 執(zhí)行main方法

3) main 方法中調(diào)用有構(gòu)造函數(shù)

父類代碼塊--》 父類構(gòu)造函數(shù)--》子類代碼塊--》子類構(gòu)造函數(shù)

4. 一個(gè)比較復(fù)雜的例子,如果下面的例子理解了,就撤離理解了Java的執(zhí)行順序

public class Text {

public static int k = 10;

public int a = print("a");

public static int b = print("b");

public static Text t1 = new Text("t1");

public static Text t2 = new Text("t2");

public static int i = print("i");

public static int n = 99;

public int j = print("j");

public int m = print("m");

{

print("構(gòu)造塊");

}

static {

print("靜態(tài)塊");

}

public int l = print("l");

public static int o = print("o");

public Text(String str) {

System.out.println("構(gòu)造:" + (++k) + ":" + str + " i=" + i + " n=" + n);

++i;

++n;

}

public static int print(String str) {

System.out.println("print:" + (++k) + ":" + str + " i=" + i + " n=" + n);

++n;

return ++i;

}

public int p = print("p");

public static void main(String args[]) {

Text t = new Text("init");

}

}

print:11:b i=0 n=0

print:12:a i=1 n=1

print:13:j i=2 n=2

print:14:m i=3 n=3

print:15:構(gòu)造塊 i=4 n=4

print:16:l i=5 n=5

print:17:p i=6 n=6

構(gòu)造:18:t1 i=7 n=7

print:19:a i=8 n=8

print:20:j i=9 n=9

print:21:m i=10 n=10

print:22:構(gòu)造塊 i=11 n=11

print:23:l i=12 n=12

print:24:p i=13 n=13

構(gòu)造:25:t2 i=14 n=14

print:26:i i=15 n=15

print:27:靜態(tài)塊 i=16 n=99

print:28:o i=17 n=100

print:29:a i=18 n=101

print:30:j i=19 n=102

print:31:m i=20 n=103

print:32:構(gòu)造塊 i=21 n=104

print:33:l i=22 n=105

print:34:p i=23 n=106

構(gòu)造:35:init i=24 n=107

執(zhí)行順序:

1)JVM 類加載機(jī)制中提到,類連接 (驗(yàn)證, 準(zhǔn)備, 解析)中準(zhǔn)備工作:

負(fù)責(zé)為類的類變量(非對(duì)象變量)分配內(nèi)存,并設(shè)置默認(rèn)初始值,準(zhǔn)備類中每個(gè)字段、方法和實(shí)現(xiàn)接口所需的數(shù)據(jù)結(jié)構(gòu), 這里說(shuō)的初始值都是默認(rèn)的值, 并不是程序中指定的值 , 經(jīng)過(guò)準(zhǔn)備工作,類中變量的初始值為如下

k =0; b=0; t1=null; t2=null; i=0; n=0;

2)? JVM在類連接以后進(jìn)行類的初始化,即給類變量賦值,按照靜態(tài)屬性的書(shū)寫順序執(zhí)行

A: public static int k = 10;? ? ?-->? k=10

B:public static int b = print("b");???-->調(diào)用print("b")? print:11:b ? i=0? ? n=0

C: public static Text t1 = new Text("t1"); ?當(dāng)加載靜態(tài)變量是需要先加載構(gòu)造器, 那就轉(zhuǎn)為先加載所有非靜態(tài)屬性

此時(shí)按照書(shū)寫的順序加載非靜態(tài), 如下所示

public int a = print("a"); --》 print:12:a i=1 n=1

public int j = print("j"); --》print:13:j i=2 n=2

public int m = print("m"); --》print:14:m i=3 n=3

{

print("構(gòu)造塊"); --》print:15:構(gòu)造塊 i=4 n=4

}

public int l = print("l"); --》print:16:l i=5 n=5

public int p = print("p"); --》print:17:p i=6 n=6

然后繼續(xù)執(zhí)行構(gòu)造器

public Text(String str) {

System.out.println("構(gòu)造:" + (++k) + ":" + str + " i=" + i + " n=" + n);

++i;

++n;

}

==》構(gòu)造:18:t1 ? i=7? ? n=7

D:?? ? public static Text t2 = new Text("t2");? 和C的過(guò)程一模一樣, 非靜態(tài)的每次new都加載一次

print:19:a ? i=8? ? n=8

print:20:j ? i=9? ? n=9

print:21:m ? i=10? ? n=10

print:22:構(gòu)造塊 ? i=11? ? n=11

print:23:l ? i=12? ? n=12

print:24:p ? i=13? ? n=13

構(gòu)造:25:t2 ? i=14? ? n=14

E:?? ? public static int i = print("i");? ==>print:26:i ? i=15? ? n=15

F:??? ? public static int n = 99;? ?n=99

G:

static {

print("靜態(tài)塊");

}

==>print:27:靜態(tài)塊 ? i=16? ? n=99

H:? ? public static int o = print("o");?==>print:28:o ? i=17? ? n=100

I:?Text t = new Text("init");

==>

print:29:a ? i=18? ? n=101

print:30:j ? i=19? ? n=102

print:31:m ? i=20? ? n=103

print:32:構(gòu)造塊 ? i=21? ? n=104

print:33:l ? i=22? ? n=105

print:34:p ? i=23? ? n=106

構(gòu)造:35:init ? i=24? ? n=107

參考:?https://www..com/greatfish/p/5771548.html1·

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Java实例化后自动执行_Java的实例化顺序(程序执行顺序)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。