順序:
父類靜態(tài)塊-->子類靜態(tài)塊--> main方法-->父類構(gòu)造代碼塊 -->父類構(gòu)造函數(shù)-->子類構(gòu)造代碼塊-->子類構(gòu)造函數(shù)恬砂,同一級(jí)別代碼塊按順序執(zhí)行咧纠。
這幾個(gè)名詞體現(xiàn)在代碼中,如下:
class Study {
public Study(){
System.out.println("構(gòu)造函數(shù)");
}
{
System.out.println("構(gòu)造代碼塊");
}
static {
System.out.println("靜態(tài)代碼塊");
}
}
靜態(tài)代碼塊和代碼塊的區(qū)別在于:
靜態(tài)代碼塊只執(zhí)行一次泻骤,代碼塊每次創(chuàng)建該對(duì)象的時(shí)候都會(huì)執(zhí)行一次漆羔。
執(zhí)行順序:
靜態(tài)變量梧奢,main方法,構(gòu)造塊演痒,構(gòu)造函數(shù)亲轨。
我覺得對(duì)于這個(gè)簡單明了的理解就是上代碼。
普通情況
- 執(zhí)行順序嫡霞,靜態(tài)變量-->靜態(tài)塊--> main方法
public class Demo {
static int a = 10;
static {
System.out.println("a----"+a);
System.out.println("A的靜態(tài)代碼塊");
}
public static void main(String[] args){
System.out.println("main");
}
}
輸出結(jié)果:
a----10
A的靜態(tài)代碼塊
main
- main方法 --> 非靜態(tài)變量--> 構(gòu)造代碼塊 --> 構(gòu)造函數(shù)
public class Demo {
static int a = 10;
static {
System.out.println("a----"+a);
System.out.println("A的靜態(tài)代碼塊");
}
int b = 20;
{
System.out.println("b----"+b);
System.out.println("A的構(gòu)造代碼塊");
}
Demo(){
System.out.println("構(gòu)造函數(shù)");
}
public static void main(String[] args){
System.out.println("main");
new Demo();
}
}
輸出結(jié)果:
a----10
A的靜態(tài)代碼塊
main
b----20
A的構(gòu)造代碼塊
構(gòu)造函數(shù)
- 靜態(tài)構(gòu)造塊只執(zhí)行一次瓶埋,構(gòu)造代碼塊每次new對(duì)象的時(shí)候都會(huì)調(diào)用。
public class Demo {
static {
System.out.println("子類的靜態(tài)代碼塊");
}
{
System.out.println("子類的構(gòu)造代碼塊");
}
Demo(){
System.out.println("子類構(gòu)造函數(shù)");
}
public static void main(String[] args){
new Demo();
new Demo();
}
}
結(jié)果:
子類的靜態(tài)代碼塊
子類的構(gòu)造代碼塊
子類構(gòu)造函數(shù)
子類的構(gòu)造代碼塊
子類構(gòu)造函數(shù)
為什么只靜態(tài)代碼塊只執(zhí)行了一次诊沪,普通代碼塊執(zhí)行了多次养筒?
靜態(tài)變量被所有的對(duì)象所共享,在內(nèi)存中只有一個(gè)副本端姚,它當(dāng)且僅當(dāng)在類初次加載時(shí)會(huì)被初始化晕粪。而非靜態(tài)變量是對(duì)象所擁有的,在創(chuàng)建對(duì)象的時(shí)候被初始化渐裸,存在多個(gè)副本巫湘,各個(gè)對(duì)象擁有的副本互不影響。
繼承情況
- 父類靜態(tài)塊-->子類靜態(tài)塊--> main方法-->父類構(gòu)造代碼塊 -->父類構(gòu)造函數(shù)-->子類構(gòu)造代碼塊--> 子類構(gòu)造函數(shù)
class Super {
static {
System.out.println("Super的靜態(tài)代碼塊");
}
{
System.out.println("Super的構(gòu)造代碼塊");
}
Super(){
System.out.println("Super構(gòu)造函數(shù)");
}
}
public class Demo extends Super{
static {
System.out.println("子類的靜態(tài)代碼塊1");
}
static {
System.out.println("子類的靜態(tài)代碼塊2");
}
{
System.out.println("子類的構(gòu)造代碼塊");
}
Demo(){
System.out.println("子類構(gòu)造函數(shù)");
}
public static void main(String[] args){
System.out.println("main");
new Demo();
}
}
輸出:
Super的靜態(tài)代碼塊
子類的靜態(tài)代碼塊1
子類的靜態(tài)代碼塊2
main
Super的構(gòu)造代碼塊
Super構(gòu)造函數(shù)
子類的構(gòu)造代碼塊
子類構(gòu)造函數(shù)
為什么會(huì)調(diào)用父類的構(gòu)造函數(shù)呢昏鹃?命名沒有調(diào)用過Super方法尚氛。
-->子類構(gòu)造函數(shù)會(huì)默認(rèn)調(diào)用一下父類的無參構(gòu)造函數(shù),可以給父類構(gòu)造函數(shù)加個(gè)參數(shù)試一下洞渤≡乃唬基礎(chǔ)知識(shí)不能忘啊。
加載過程:
在執(zhí)行開始载迄,先要尋找到main方法讯柔,因?yàn)閙ain方法是程序的入口,但是在執(zhí)行main方法之前护昧,必須先加載Demo類魂迄,而在加載Demo類的時(shí)候發(fā)現(xiàn)Demo類繼承自Super類,因此會(huì)轉(zhuǎn)去先加載Super類惋耙,在加載Super類的時(shí)候捣炬,發(fā)現(xiàn)有static塊,便執(zhí)行了static塊绽榛。在Super類加載完成之后湿酸,便繼續(xù)加載Demo類,然后發(fā)現(xiàn)Demo類中也有static塊蒜田,便執(zhí)行static塊稿械。在加載完所需的類之后,便開始執(zhí)行main方法冲粤。在main方法中執(zhí)行new Demo()的時(shí)候會(huì)先調(diào)用父類的構(gòu)造器美莫,然后再調(diào)用自身的構(gòu)造器页眯。因此,便出現(xiàn)了上面的輸出結(jié)果厢呵。
同時(shí)存在兩個(gè)代碼塊的時(shí)候窝撵,按代碼順序執(zhí)行。
題目
public class Demo {
private static Demo test = new Demo();
//靜態(tài)變量sta1 未賦予初始值
public static int sta1;
//靜態(tài)變量sta1 賦予初始值20
public static int sta2 = 20;
//構(gòu)造方法中對(duì)于靜態(tài)變量賦值
private Demo() {
sta1 ++ ;
sta2 ++ ;
}
public static void main(String[] args) {
System.out.println(Demo.sta1);
System.out.println(Demo.sta2);
}
}
print:
1
20
res:都是static就順序執(zhí)行襟铭,執(zhí)行完后碌奉,讓sta1和2自增,完后sta2又賦值為20寒砖。
補(bǔ)充一個(gè)demo
構(gòu)造代碼塊和對(duì)象綁定赐劣,簡單講,不new對(duì)象不走構(gòu)造代碼塊
public class Animal {
private static int k;
static{
System.out.println("父類的靜態(tài)方法");
}
{
System.out.println("執(zhí)行父類的構(gòu)造代碼塊");
}
public Animal(){
System.out.println("執(zhí)行父類的構(gòu)造方法");
}
public static void main(String[] args) {
System.out.println(Animal.k);
}
}
print:
父類的靜態(tài)方法
0
這個(gè)鏈接里面也有幾道燒腦的題目哩都,反正就按順序來就好了魁兼,但是寫代碼的時(shí)候最好還是以大部分人能看明白為主,要不然光這個(gè)點(diǎn)很多人就得進(jìn)坑漠嵌,而且時(shí)間久了自己也會(huì)記不牢咐汞。
https://www.cnblogs.com/chihirotan/p/6043442.html