小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

[轉(zhuǎn)]構(gòu)造函數(shù)為什么不能被abstract/static/final/native/stricftp/synchronized修飾 及 一些關(guān)鍵字的用法

 司馬小賊 2017-11-20

[轉(zhuǎn)]構(gòu)造函數(shù)為什么不能被abstract/static/final/native/stricftp/synchronized修飾 及 一些關(guān)鍵字的用法

from:http://www./realsmy/archive/2007/04/10/109256.html

from:http://www./html/j2se/javajc/2010/0408/3262.html

from:http://www./topic/72543

from:http://www./a/100627/50164/

from:http://blog./sword2008/13772.html

from:http://www.cnblogs.com/wjun530/archive/2007/09/15/893802.html

 

不同于方法,構(gòu)造器不能是abstract, static, final, native, strictfp, 或者synchronized的. 
1.構(gòu)造器不是通過繼承得到的,所以沒有必要把它聲明為final的。 
2.同理,一個(gè)抽象的構(gòu)造器將永遠(yuǎn)不會(huì)被實(shí)現(xiàn)。(所以也不能聲明為abstract的) 
3.構(gòu)造器總是關(guān)聯(lián)一個(gè)對(duì)象而被調(diào)用,所以把它聲明為static是沒有意義的。 
4.沒有實(shí)際的需要把構(gòu)造器定義成同步的,因?yàn)樗鼘?huì)在構(gòu)造的時(shí)候鎖住該對(duì)象,直到所有的構(gòu)造器完成它們的工作,這個(gè)構(gòu)造的過程對(duì)其它線程來說,通常是不可訪問的。 (synchronized) 
5.本地化的方法情況特別復(fù)雜,所以JVM調(diào)用起來非常麻煩,需要考慮很多種情況,沒有native關(guān)鍵字的情況下,JVM實(shí)現(xiàn)起來比較容易。

 

注:strictfp、native、transient、volatile用法

1)strictfp:strictfp的意思是FP-strict,也就是說精確浮點(diǎn)的意思。

在Java虛擬機(jī)進(jìn)行浮點(diǎn)運(yùn)算時(shí),如果沒有指定strictfp關(guān)鍵字時(shí), Java的編譯器以及運(yùn)行環(huán)境在對(duì)浮點(diǎn)運(yùn)算的表達(dá)式是采取一種近似于我行我素的行為來完成這些操作,以致于得到的結(jié)果往往無法令你滿意。而一旦使用了 strictfp來聲明一個(gè)類、接口或者方法時(shí),那么所聲明的范圍內(nèi)Java的編譯器以及運(yùn)行環(huán)境會(huì)完全依照浮點(diǎn)規(guī)范IEEE-754來執(zhí)行。因此如果你想讓你的浮點(diǎn)運(yùn)算更加精確,而且不會(huì)因?yàn)椴煌挠布脚_(tái)所執(zhí)行的結(jié)果不一致的話,那就請(qǐng)用關(guān)鍵字strictfp。

你可以將一個(gè)類、接口以及方法聲明為strictfp,但是不允許對(duì)接口中的方法以及構(gòu)造函數(shù)聲明strictfp關(guān)鍵字。例如:

一、錯(cuò)誤的使用方法

interface A { 
    strictfp void f(); //接口中的方法 

public class FpDemo2 { 
    strictfp FpDemo2() {} // 構(gòu)造函數(shù) 
}

二、合法的使用關(guān)鍵字strictfp

strictfp interface A {} //接口 
public strictfp class FpDemo1 { //類 
    strictfp void f() {} //方法 
}

2)native:native是方法修飾符。Native方法是由另外一種語言(如c/c++,F(xiàn)ORTRAN,匯編)實(shí)現(xiàn)的本地方法。有時(shí)java應(yīng)用需要與java外面的環(huán)境交互。這是本地方法存在的主要原因。

因?yàn)樵谕獠繉?shí)現(xiàn)了方法,所以在java代碼中,就不需要聲明了,有點(diǎn)類似于接口方法。Native可以和其他一些修飾符連用,但是abstract方法和Interface方法不能用native來修飾。

在定義一個(gè)native method時(shí),并不提供實(shí)現(xiàn)體(有些像定義一個(gè)java interface),因?yàn)槠鋵?shí)現(xiàn)體是由非java語言在外面實(shí)現(xiàn)的。例:    
    public class IHaveNatives 
    { 
      native public void Native1( int x ) ; 
      native static public long Native2() ; 
      native synchronized private float Native3( Object o ) ; 
      native void Native4( int[] ary ) throws Exception ; 
    } 
    這些方法的聲明描述了一些非java代碼在這些java代碼里看起來像什么樣子(view). 
    不能用abstract的原因:這是合理的,因?yàn)閚ative暗示這些方法是有實(shí)現(xiàn)體的,只不過這些實(shí)現(xiàn)體是非java的,但是abstract卻顯然的指明這些方法無實(shí)現(xiàn)體。

    native與其它java標(biāo)識(shí)符連用時(shí),其意義同非Native Method并無差別,比如native static表明這個(gè)方法可以在不產(chǎn)生類的實(shí)例時(shí)直接調(diào)用,這非常方便,比如當(dāng)你想用一個(gè)native method去調(diào)用一個(gè)C的類庫時(shí)。上面的第三個(gè)方法用到了native synchronized,JVM在進(jìn)入這個(gè)方法的實(shí)現(xiàn)體之前會(huì)執(zhí)行同步鎖機(jī)制。

3)transient:變量修飾符(只能修飾字段)。

標(biāo)記為transient的變量,在對(duì)象存儲(chǔ)時(shí),這些變量狀態(tài)不會(huì)被持久化。當(dāng)對(duì)象序列化地保存在存儲(chǔ)器上時(shí),不希望有些字段數(shù)據(jù)被保存,為了保證安全性,可以把這些字段聲明為transient。

4)volatile:volatile修飾變量。在每次被線程訪問時(shí),都強(qiáng)迫從共享內(nèi)存中重讀該成員變量的值。而且,當(dāng)成員變量發(fā)生變化時(shí),強(qiáng)迫線程將變化值回寫到共享內(nèi)存。這樣在任何時(shí)刻,兩個(gè)不同的線程總是看到某個(gè)成員變量的同一個(gè)值。

volatile與synchronized的區(qū)別:

1.volatile本質(zhì)是在告訴jvm當(dāng)前變量在寄存器(工作內(nèi)存)中的值是不確定的,需要從主存中讀取;synchronized則是鎖定當(dāng)前變量,只有當(dāng)前線程可以訪問該變量,其他線程被阻塞住。 
2.volatile僅能使用在變量級(jí)別;synchronized則可以使用在變量、方法、和類級(jí)別的 
3.volatile僅能實(shí)現(xiàn)變量的修改可見性,不能保證原子性;而synchronized則可以保證變量的修改可見性和原子性 
4.volatile不會(huì)造成線程的阻塞;synchronized可能會(huì)造成線程的阻塞。 
5.volatile標(biāo)記的變量不會(huì)被編譯器優(yōu)化;synchronized標(biāo)記的變量可以被編譯器優(yōu)化

5)static:

1>靜態(tài)方法:通常,在一個(gè)類中定義一個(gè)方法為static,那就是說,用類名而無需本類的對(duì)象即可調(diào)用此方法。靜態(tài)方法常常為應(yīng)用程序中的其它類提供一些實(shí)用工具所用。

2>靜態(tài)變量:靜態(tài)變量與靜態(tài)方法類似。所有此類實(shí)例共享此靜態(tài)變量,也就是說在類裝載時(shí),只分配一塊存儲(chǔ)空間,所有此類的對(duì)象都可以操控此塊存儲(chǔ)空間,當(dāng)然對(duì)于final則另當(dāng)別論了。

3>static定義的變量會(huì)優(yōu)先于任何其它非static變量,不論其出現(xiàn)的順序如何。

在static{}內(nèi)的代碼,是用來進(jìn)行顯式的靜態(tài)變量初始化,這段代碼只會(huì)初始化一次,且在類被第一次裝載時(shí)。在涉及到繼承的時(shí)候,會(huì)先初始化父類的static變量,然后是子類的,依次類推。

4>通常一個(gè)普通類不允許聲明為靜態(tài)的,只有一個(gè)內(nèi)部類才可以。這時(shí)這個(gè)聲明為靜態(tài)的內(nèi)部類可以直接作為一個(gè)普通類來使用,而不需實(shí)例一個(gè)外部類。但是,不能從靜態(tài)內(nèi)部類的對(duì)象中訪問非靜態(tài)的外圍類對(duì)象和方法(可訪問外部靜態(tài)的對(duì)象、方法)。例如:

public class StaticCls{ 
  public static void main(String[] args){ 
    OuterCls.InnerCls oi=new OuterCls.InnerCls(); 
  } 

class OuterCls{ 
  public static class InnerCls{ 
    InnerCls(){ 
      System.out.println("InnerCls"); 
    } 
   } 
}

PS:非static內(nèi)部類,初始化方法:

outerObject=new outerClass(Constructor Parameters);

outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters);

注意在創(chuàng)建非靜態(tài)內(nèi)部類對(duì)象時(shí),一定要先創(chuàng)建起相應(yīng)的外部類對(duì)象。至于原因,非靜態(tài)內(nèi)部類對(duì)象有著指向其外部類對(duì)象的引用,一個(gè)內(nèi)部類對(duì)象可以訪問創(chuàng)建它的外部類對(duì)象的內(nèi)容,甚至包括私有變量!

static與非static內(nèi)部類區(qū)別:1、靜態(tài)內(nèi)部類沒有了指向外部的引用。2、在任何非靜態(tài)內(nèi)部類中,都不能有靜態(tài)數(shù)據(jù),靜態(tài)方法或者又一個(gè)靜態(tài)內(nèi)部類(內(nèi)部類的嵌套可以不止一層)。不過靜態(tài)內(nèi)部類中卻可以擁有這一切。

6)final

final變量:

在類中定義變量時(shí),在其前面加上final關(guān)鍵字,那便是說,這個(gè)變量一旦被初始化便不可改變,這里不可改變的意思對(duì)基本類型來說是其值不可變,而對(duì)于對(duì)象變量來說其引用不可再變。

其初始化可以在兩個(gè)地方,一是其定義處,也就是說在final變量定義時(shí)直接給其賦值,二是在構(gòu)造函數(shù)中。這兩個(gè)地方只能選其一,要么在定義時(shí)給值,要么在構(gòu)造函數(shù)中給值,不能同時(shí)既在定義時(shí)給了值,又在構(gòu)造函數(shù)中給另外的值。

還有一種用法是定義方法中的參數(shù)為final,對(duì)于基本類型的變量,這樣做并沒有什么實(shí)際意義,因?yàn)榛绢愋偷淖兞吭谡{(diào)用方法時(shí)是傳值的,也就是說你可以在方法中更改這個(gè)參數(shù)變量而不會(huì)影響到調(diào)用語句,然而對(duì)于對(duì)象變量,卻顯得很實(shí)用,因?yàn)閷?duì)象變量在傳遞時(shí)是傳遞其引用,這樣你在方法中對(duì)對(duì)象變量的修改也會(huì)影響到調(diào)用語句中的對(duì)象變量,當(dāng)你在方法中不需要改變作為參數(shù)的對(duì)象變量時(shí),明確使用final進(jìn)行聲明,會(huì)防止你無意的修改而影響到調(diào)用方法。

final方法: 
將方法聲明為final,那就說明你已經(jīng)知道這個(gè)方法提供的功能已經(jīng)滿足你要求,不需要進(jìn)行擴(kuò)展,并且也不允許任何從此類繼承的類來覆寫這個(gè)方法,但是繼承仍然可以繼承這個(gè)方法,也就是說可以直接使用。編譯器在遇到調(diào)用final方法時(shí)候會(huì)轉(zhuǎn)入內(nèi)嵌inline機(jī)制,它會(huì)使你在調(diào)用final方法時(shí),直接將方法主體插入到調(diào)用處,而不是進(jìn)行例行的方法調(diào)用,例如保存斷點(diǎn),壓棧等,這樣可能會(huì)使你的程序效率有所提高,然而當(dāng)你的方法主體非常龐大時(shí),或你在多處調(diào)用此方法,那么你的調(diào)用主體代碼便會(huì)迅速膨脹,可能反而會(huì)影響效率,所以你要慎用final進(jìn)行方法定義。


final類: 
當(dāng)你將final用于類身上時(shí),你就需要仔細(xì)考慮,因?yàn)橐粋€(gè)final類是無法被任何人繼承的,那也就意味著此類在一個(gè)繼承樹中是一個(gè)葉子類,并且此類的設(shè)計(jì)已被認(rèn)為很完美而不需要進(jìn)行修改或擴(kuò)展。對(duì)于final類中的成員,你可以定義其為final,也可以不是final。對(duì)于方法,由于所屬類為final的關(guān)系,自然也就成了final型的。你也可以明確的給final類中的方法加上一個(gè)final,但這顯然沒有意義。

7)static和final一塊用表示什么 
static final用來修飾成員變量和成員方法,可簡(jiǎn)單理解為“全局常量”! 
對(duì)于變量,表示一旦給值就不可修改,并且通過類名可以訪問; 對(duì)于方法,表示不可覆蓋,并且可以通過類名直接訪問。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多