靜態(tài)的屬于類的影所,非靜態(tài)屬于對(duì)象的边酒!
### 1、先執(zhí)行靜態(tài)代碼塊
publicclassOrderTest{
static{
System.out.println("static code execute");
?? }
publicstaticvoidmain(String[]args) {
System.out.println("main() execute");
?? }
}
執(zhí)行結(jié)果:
staticcodeexecute
main()execute
2、類中定義靜態(tài)成員變量對(duì)象钟些,會(huì)先創(chuàng)建對(duì)象
publicclassOrderTest{
// 跟位置無(wú)關(guān)烟号,最后執(zhí)行
publicstaticvoidmain(String[]args) {
System.out.println("main() execute");
?? }
// 位置一 執(zhí)行順序早于靜態(tài)代碼塊
// static User user = new User();
static{
System.out.println("static code execute");
?? }
// 位置二 執(zhí)行順序晚于靜態(tài)代碼塊(取決于位置)
staticUseruser=newUser();
}
staticcodeexecute
Userinit...
main()execute
靜態(tài)代碼的執(zhí)行一定先于main方法,靜態(tài)代碼塊和靜態(tài)成員變量的執(zhí)行順序是由代碼位置決定的政恍,誰(shuí)寫前面就先執(zhí)行誰(shuí)汪拥。
3、如果是非靜態(tài)代碼塊和非靜態(tài)成員變量篙耗,不執(zhí)行迫筑。
publicclassOrderTest2{
?? {
System.out.println("static code execute");
?? }
Useruser=newUser();
publicstaticvoidmain(String[]args) {
System.out.println("main() execute");
?? }
}
執(zhí)行結(jié)果:
// 僅僅執(zhí)行main方法
main()execute
只有在創(chuàng)建Test對(duì)象的時(shí)候,才會(huì)執(zhí)行非靜態(tài)代碼塊和非靜態(tài)成員變量宗弯。
main方法中的執(zhí)行順序?yàn)轫樞驁?zhí)行脯燃!
publicclassOrderTest2{
?? {
System.out.println("code execute");
?? }
Useruser=newUser();
publicstaticvoidmain(String[]args) {
OrderTest2test=newOrderTest2();
System.out.println("main() execute");
OrderTest2test2=newOrderTest2();
OrderTest2test3=newOrderTest2();
?? }
}
執(zhí)行結(jié)果:
codeexecute
Userinit...
main()execute
codeexecute
Userinit...
codeexecute
Userinit...
創(chuàng)建多少個(gè)對(duì)象,就會(huì)執(zhí)行多少次代碼快蒙保,創(chuàng)建多少個(gè)成員變量辕棚,非靜態(tài)代碼快和非靜態(tài)成員變量的執(zhí)行順序是由代碼位置決定的,誰(shuí)寫前面誰(shuí)先執(zhí)行邓厕。
4逝嚎、如果同時(shí)存在非靜態(tài)代碼塊和靜態(tài)代碼塊,以及非靜態(tài)成員變量和靜態(tài)成員變量详恼,先執(zhí)行靜態(tài)的東西补君,并且只執(zhí)行一次,再執(zhí)行非靜態(tài)的東西(創(chuàng)建對(duì)象)昧互,創(chuàng)建多個(gè)對(duì)象就會(huì)執(zhí)行多少次挽铁。
publicclassOrderTest2{
?? {
System.out.println("code execute");
?? }
Useruser=newUser();
static{
System.out.println("static");
?? }
staticUseruser1=newUser();
publicstaticvoidmain(String[]args) {
OrderTest2test=newOrderTest2();
System.out.println("main() execute");
OrderTest2test2=newOrderTest2();
OrderTest2test3=newOrderTest2();
?? }
}
執(zhí)行結(jié)果:
static
Userinit...
codeexecute
Userinit...
main()execute
codeexecute
Userinit...
codeexecute
Userinit...
5、加入父子類
外部類
publicclassStub{
publicStub(Stringstring) {
System.out.println(string+"object created...");
?? }
}
父類
publicclassParent{
staticStubparentStaticStub=newStub("parent static object->");
static{
System.out.println("parent static code execute");
?? }
?? {
System.out.println("parent code execute");
?? }
StubparentStub=newStub("parent object-");
Stubstub;
publicParent() {
System.out.println("parent constructor execute");
stub=newStub("parent constructor created object-");
?? }
publicvoidsayHello() {
System.out.println("hello from parent");
?? }
}
子類
publicclassChildextendsParent{
staticStubchildStaticStub=newStub("child static object->");
static{
System.out.println("child static code execute");
?? }
?? {
System.out.println("child code execute");
?? }
StubchildStub=newStub("child object-");
Stubstub;
publicChild() {
? ? ? ? ? ? ? ? // super(); 默認(rèn)調(diào)用父類的構(gòu)造器
System.out.println("child constructor execute");
stub=newStub("child constructor created object-");
?? }
publicvoidsayHello() {
System.out.println("hello from child");
?? }
}
測(cè)試類
publicclassExtendOrderTest{
publicstaticvoidmain(String[]args) {
Childchild=newChild();
child.sayHello();
((Parent)child).sayHello();
?? }
}
執(zhí)行結(jié)果:
parentstaticobject->objectcreated...
parentstaticcodeexecute
//----
childstaticobject->objectcreated...
childstaticcodeexecute
//----
parentcodeexecute
parentobject-objectcreated...
parentconstructorexecute
parentconstructorcreatedobject-objectcreated...
//----
childcodeexecute
childobject-objectcreated...
childconstructorexecute
childconstructorcreatedobject-objectcreated...
//----
hellofromchild
//----
hellofromchild
開始分析
①? (實(shí)例化Child對(duì)象敞掘,執(zhí)行其無(wú)參構(gòu)造屿储,無(wú)參構(gòu)造函數(shù)中默認(rèn)執(zhí)行super()方法!)首先會(huì)加載Parent渐逃,則Parent中的靜態(tài)代碼塊和靜態(tài)成員變量會(huì)優(yōu)先執(zhí)行够掠。
②? (先加載類,再執(zhí)行代碼)加載Child茄菊,則Child中的靜態(tài)代碼塊和靜態(tài)成員變量會(huì)優(yōu)先執(zhí)行疯潭。
③? 類加載完之后,創(chuàng)建對(duì)象面殖,先創(chuàng)建Parent對(duì)象竖哩,創(chuàng)建對(duì)象前,先創(chuàng)建對(duì)象的資源脊僚。
④? 執(zhí)行Parent構(gòu)造器相叁,完成對(duì)象的創(chuàng)建遵绰。
⑤? 創(chuàng)建Child對(duì)象之前,先創(chuàng)建對(duì)象的資源增淹。
⑥? 執(zhí)行Child構(gòu)造器椿访,完成對(duì)象創(chuàng)建。
⑦? 執(zhí)行sayHello()方法虑润。
⑧? 盡管進(jìn)行了強(qiáng)制類型的轉(zhuǎn)換成玫,但實(shí)際上對(duì)象本省還是內(nèi)存當(dāng)中的子對(duì)象,所以輸出的內(nèi)容都是來(lái)自于子對(duì)象(hello)的調(diào)用拳喻。(父類類型指向子類對(duì)象哭当,是多態(tài))
----學(xué)習(xí)內(nèi)容來(lái)源于B站up主(楠哥教你學(xué)Java)