免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
final、static、代碼塊、靜態(tài)代碼塊、內(nèi)部類、代碼執(zhí)行順序

 

正文

final

final域使得確保初始化安全性(initialization safety)成為可能,初始化安全性讓不可變形對(duì)象不需要同步就能自由地被訪問(wèn)和共享
作用在類上               則為final類,final類不能被繼承。一般用于工具類時(shí),同時(shí)把工具類構(gòu)造函數(shù)聲明為私有,暴露靜態(tài)共有方法
作用在成員變量上    則視為常量。此時(shí)賦值方式有三種:(1)聲明時(shí)賦值(2)構(gòu)造函數(shù)中賦值(3)代碼塊中賦值。 即不管哪種方式都要保證在使用該變量之前要確保已經(jīng)有值。使用該特性,可以強(qiáng)制賦值。final變量因?yàn)椴豢勺?,所以可以安全的存在于多線程中。
作用在方法上           作用在方法上可以保證該方法不能被重寫
作用在參數(shù)上           保證在方法體內(nèi)部參數(shù)值不會(huì)被再次賦值,一般好的編程習(xí)慣應(yīng)該把參數(shù)值視為final,不管有沒(méi)有顯示使用final(重構(gòu))

static

static關(guān)鍵字是隸屬于類而非對(duì)象。這也就意味著不管聲明了幾個(gè)對(duì)象,static關(guān)鍵字所修飾的空間只占用一份。改變了之后,所有的引用它的都會(huì)發(fā)生變化。靜態(tài)成員變量為所有類的對(duì)象共享。不像對(duì)象之間的變量是無(wú)影響的。所以對(duì)于static修飾的成員變量或者靜態(tài)代碼塊是在類加載的時(shí)候已經(jīng)裝載。這種特性可以做一些初始化的工作而且保證只初始化了一次。
作用在包上 (import static(注意這里不是static import  com…..ClassName.* 靜態(tài)導(dǎo)包)這種以后再使用包里面的靜態(tài)方法或者成員變量時(shí)會(huì)比較方便。eg:
import static java.lang.Integer.*;int max_value = MAX_VALUE;toHexString(max_value);
這樣就導(dǎo)入了Integer類下面所有的靜態(tài)方法和成員變量。在使用的時(shí)候就可以省去Integer,直接使用。
作用在類上       修飾類則為靜態(tài)類。只能作為靜態(tài)內(nèi)部類,如果直接修飾類,則不能通過(guò)編譯。
作用在方法上   修飾方法則為靜態(tài)方法。靜態(tài)方法中不能使用非靜態(tài)變量。因?yàn)殪o態(tài)方法中不能確定該方法是否有被初始化。但是非靜態(tài)方法可以引用靜態(tài)變量。
作用在變量上   作用在變量上則為靜態(tài)變量。靜態(tài)成員變量一般聲明為final的。因?yàn)殡`屬于該類所有對(duì)象,可更改存在著危險(xiǎn)。

代碼塊

代碼塊分為普通代碼塊和構(gòu)造代碼塊
普通代碼塊:在方法或語(yǔ)句中出現(xiàn)的{},用的比較少。執(zhí)行順序是按聲明順序執(zhí)行。eg:
1 public static void main(String[] args) {2 {3 System.out.println('普通代碼塊-先聲明');4 }5 System.out.println('函數(shù)普通');6 {7 System.out.println('普通代碼塊-后聲明');8 }9 }
程序輸出結(jié)果如下:
普通代碼塊-先聲明函數(shù)普通普通代碼塊-后聲明
構(gòu)造代碼塊:直接在類中定義且沒(méi)有static關(guān)鍵字的代碼塊,比較常用。執(zhí)行順序是在構(gòu)造函數(shù)執(zhí)行之前執(zhí)行,每聲明一個(gè)對(duì)象都會(huì)執(zhí)行一次。
1 public class CodeBlock { 2 { 3 System.out.println('構(gòu)造代碼塊-先聲明-執(zhí)行'); 4 } 5 public CodeBlock(){ 6 System.out.println('構(gòu)造器執(zhí)行'); 7 } 8 { 9 System.out.println('構(gòu)造代碼塊-后聲明-執(zhí)行');10 }11 public void plainFunc(){12 System.out.println('普通方法執(zhí)行');13 }14 public static void main(String[] args) {15 System.out.println('main方法');16 CodeBlock cb1 = new CodeBlock();17 cb.plainFunc();18 CodeBlock cb2 = new CodeBlock();19 }20 }
程序輸出結(jié)果如下:
main方法構(gòu)造代碼塊-先聲明-執(zhí)行構(gòu)造代碼塊-后聲明-執(zhí)行構(gòu)造器執(zhí)行普通方法執(zhí)行構(gòu)造代碼塊-先聲明-執(zhí)行構(gòu)造代碼塊-后聲明-執(zhí)行構(gòu)造器執(zhí)行
結(jié)論:
執(zhí)行順序:main方法->構(gòu)造代碼塊->構(gòu)造函數(shù)->普通方法
每實(shí)例化一個(gè)對(duì)象,則執(zhí)行一次構(gòu)造代碼塊

靜態(tài)代碼塊

在java中使用static關(guān)鍵字聲明的代碼塊。靜態(tài)塊用于初始化類,為類的屬性初始化。每個(gè)靜態(tài)代碼塊只會(huì)執(zhí)行一次。由于JVM在加載類時(shí)會(huì)執(zhí)行靜態(tài)代碼塊,所以靜態(tài)代碼塊先于主方法執(zhí)行。
如果類中包含多個(gè)靜態(tài)代碼塊,那么將按照'先定義的代碼先執(zhí)行,后定義的代碼后執(zhí)行'。
注意:1 靜態(tài)代碼塊不能存在于任何方法體內(nèi)。2 靜態(tài)代碼塊不能直接訪問(wèn)靜態(tài)實(shí)例變量和實(shí)例方法,需要通過(guò)類的實(shí)例對(duì)象來(lái)訪問(wèn)。
1 class Code{ 2 { 3 System.out.println('Code的構(gòu)造塊'); 4 } 5 6 static{ 7 System.out.println('Code的靜態(tài)代碼塊'); 8 } 9 10 public Code(){11 System.out.println('Code的構(gòu)造方法');12 }13 }14 public class CodeBlock{15 {16 System.out.println('CodeBlock的構(gòu)造塊'); 17 }18 19 static{20 System.out.println('CodeBlock的靜態(tài)代碼塊');21 }22 23 public CodeBlock03(){24 System.out.println('CodeBlock的構(gòu)造方法');25 }26 27 public static void main(String[] args){28 System.out.println('CodeBlock的主方法');29 new Code();30 new Code();31 new CodeBlock();32 new CodeBlock();33 }34 }
程序輸出如下
CodeBlock的靜態(tài)代碼塊CodeBlock的主方法 //這里還沒(méi)有加載Code,所以先執(zhí)行主方法,再執(zhí)行Code的靜態(tài)代碼塊Code的靜態(tài)代碼塊 Code的構(gòu)造塊Code的構(gòu)造方法Code的構(gòu)造塊Code的構(gòu)造方法CodeBlock的構(gòu)造塊CodeBlock的構(gòu)造方法

內(nèi)部類

⒈成員內(nèi)部類⒉靜態(tài)內(nèi)部類⒊局部?jī)?nèi)部類⒋匿名內(nèi)部類
定義
將一個(gè)類的定義放在另一個(gè)類的定義內(nèi)部,這就是內(nèi)部類
初見(jiàn)內(nèi)部類
內(nèi)部類的創(chuàng)建就和定義的一樣,把一個(gè)類定義在另一個(gè)類的內(nèi)部(java語(yǔ)法規(guī)定一個(gè)類中只能有一個(gè)是public的,所以內(nèi)部類不能用public修飾)
1 public class Parcel2 { 2 class Contents { 3 private int i = 11; 4 public int value() { return i; } 5 } 6 class Destination { 7 private String label; 8 Destination(String whereTo) { 9 label = whereTo;10 }11 String readLabel() { return label; }12 }13 public Destination to(String s) {14 return new Destination(s);15 }16 public Contents contents() {17 return new Contents();18 }19 public void ship(String dest) {20 Contents c = contents();21 Destination d = to(dest);22 System.out.println(d.readLabel());23 }24 public static void main(String[] args) {25 Parcel2 p = new Parcel2();26 p.ship('Tasmania');27 Parcel2 q = new Parcel2();28 // Defining references to inner classes:29 Parcel2.Contents c = q.contents();30 Parcel2.Destination d = q.to('Borneo');31 }32 }
這里在類Parcel2中創(chuàng)建了兩個(gè)內(nèi)部類Contents和Destination。同時(shí)每個(gè)內(nèi)部類對(duì)應(yīng)的創(chuàng)建了一個(gè)外部類方法,該方法用來(lái)返回一個(gè)指向內(nèi)部類對(duì)象的引用。這種方式很常用!如果不提供指向內(nèi)部類對(duì)象引用的函數(shù),需要借助“.new”來(lái)創(chuàng)建內(nèi)部類對(duì)象(后面會(huì)有用法)。如果想從外部類的非靜態(tài)方法之外的任意位置創(chuàng)建某個(gè)內(nèi)部類對(duì)象,那么必須像上述main()方法那樣,具體指明這個(gè)對(duì)象的類型:OutClassName.InnerClassName(eg:Parcel2.Contents),為什么要這么做呢?
注意:非靜態(tài)內(nèi)部類對(duì)象有著指向外部類對(duì)象的引用。
這可以至少解釋兩個(gè)問(wèn)題:
1、內(nèi)部類擁有外部類的所有元素的訪問(wèn)權(quán)(因?yàn)楫?dāng)生成內(nèi)部類時(shí)內(nèi)部類自動(dòng)產(chǎn)生了指向外部類對(duì)象的引用,該引用可以訪問(wèn)外部類的所有成員)
2、創(chuàng)建內(nèi)部類對(duì)象時(shí),需要指明對(duì)象類型,即:
OutClassName out = new OutClassName();
OutClassName.InnerClassName=out.new InnerClassName(); 
使用 .this 和 .new
如果需要生成對(duì)外部類對(duì)象的引用,可以使用外部類的名字后面緊跟原點(diǎn)和this。如果需要生成內(nèi)部類對(duì)象,可以使用外部類對(duì)象后面緊跟原點(diǎn)和this。
外部類引用:
public class DotThis { void f() { System.out.println('DotThis.f()'); } public class Inner { public DotThis outer() { return DotThis.this; // A plain 'this' would be Inner's 'this' } } public Inner inner() { return new Inner(); } public static void main(String[] args) { DotThis dt = new DotThis(); DotThis.Inner dti = dt.inner(); dti.outer().f(); }}
注意:上面代碼DotThis.this返回外部類對(duì)象引用,如果直接使用this,則是內(nèi)部類Inner對(duì)象引用,不能通過(guò)編譯。
創(chuàng)建內(nèi)部類對(duì)象:
public class DotNew { public class Inner {} public static void main(String[] args) { DotNew dn = new DotNew(); DotNew.Inner dni = dn.new Inner(); }}
內(nèi)部類語(yǔ)法
一、成員內(nèi)部類(非靜態(tài)):
1、可以訪問(wèn)外部類所有元素
2、創(chuàng)建對(duì)象兩種方式:(1)在外部類中聲明方法返回內(nèi)部類對(duì)象的引用(2)通過(guò)內(nèi)部類對(duì)象后跟原點(diǎn)和new的方式(eg:DotNew dn = new DotNew(); DotNew.Inner dni = dn.new Inner();)
3、成員內(nèi)部類中不能包含靜態(tài)數(shù)據(jù)(成員變量和方法)
二、靜態(tài)內(nèi)部類:
1、不能訪問(wèn)外部類的非靜態(tài)元素和方法。(因?yàn)殪o態(tài)內(nèi)部類沒(méi)有指向外部類對(duì)象的引用,只能直接通過(guò)類名來(lái)調(diào)用)
2、創(chuàng)建方式比較簡(jiǎn)單
Outer.Inner inner = new Outer.Inner();inner.func();
3、可以包含靜態(tài)數(shù)據(jù)
三、局部?jī)?nèi)部類
局部?jī)?nèi)部類就是可以定義在方法體內(nèi),比較少用
四、匿名內(nèi)部類
interface content{ int func(); }System.out.println(new content(){ @Override public int func() { return 1; } }.func());
內(nèi)部類優(yōu)勢(shì):
1、可以訪問(wèn)外部類所有元素
2、隱藏性好,只有本類可操作
3、可以解決C 里面的多繼承問(wèn)題。怎么解決?
我們知道,Java不支持多繼承(即一個(gè)類同時(shí)繼承兩個(gè)或多個(gè)類),只支持多重繼承(即A繼承B,B繼承C,那么A間接繼承了C),利用Java的內(nèi)部類機(jī)制可以做到多重繼承的效果??梢月暶鞫鄠€(gè)內(nèi)部類分別繼承相應(yīng)的類,然后對(duì)于外部類來(lái)說(shuō),就同時(shí)擁有了相應(yīng)內(nèi)部類的功能。

代碼執(zhí)行順序

1、父類靜態(tài)代碼塊->父類靜態(tài)成員變量初始化->子類靜態(tài)代碼塊->子類靜態(tài)成員變量初始化->(父類代碼塊->父類成員變量初始化)(這兩個(gè)誰(shuí)先聲明誰(shuí)在前面)->子類代碼塊->子類成員變量初始化->父類構(gòu)造函數(shù)->子類構(gòu)造函數(shù)->...
  • 靜態(tài)先于非靜態(tài)執(zhí)行
  • 代碼塊可以當(dāng)做成員變量來(lái)看,對(duì)于靜態(tài)代碼塊,類加載的時(shí)候執(zhí)行;對(duì)于非靜態(tài)代碼塊,構(gòu)造函數(shù)之前執(zhí)行,可以想成是在成員變量初始化的時(shí)候執(zhí)行
  • 父類優(yōu)先于子類執(zhí)行(因?yàn)樽宇惿婕暗綄?duì)父類的重寫等操作,只有父類初始完畢了,子類重寫和引用才有意義)

參考文章:

1、《java編程思想》

2、http://www.cnblogs.com/sophine/p/3531282.html

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java中普通代碼塊,構(gòu)造代碼塊,靜態(tài)代碼塊區(qū)別
java內(nèi)部類及類加載順序
Java基礎(chǔ)
類的初始化順序
Java中類的初始化順序
java中子類繼承父類,程序運(yùn)行順序
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服