日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

java中的修飾符static與靜態(tài)方法final的用法

 zjjyyy 2010-07-04
  • 一、static
      修飾屬性,方法,代碼塊

    1、靜態(tài)方法:
       使這個方法成為整個類所公有的方法,可以用   類名.方法名  直接訪問  
      
       注意:static修飾的方法,不能直接訪問(可以通過組合方式訪問)本類中的非靜態(tài)(static)成員(包括方法和屬性)
             本類的非靜態(tài)(static)方法可以訪問本類的靜態(tài)成員(包括方法和屬性),可以調(diào)用靜態(tài)方法。
             靜態(tài)方法要慎重使用。在靜態(tài)方法中不能出現(xiàn)this關鍵字,因為這是針對對象而言的。
            
       java中的main方法必須寫成static的,因為,在類加載時無法創(chuàng)建對象,靜態(tài)方法可以不通過對象調(diào)用。
       所以在類加載時就可以通過main方法入口來運行程序。        
      
       注意:父類中是靜態(tài)方法,子類中不能覆蓋為非靜態(tài)方法。
             在符合覆蓋規(guī)則的前提下,在父子類中,父類中的靜態(tài)方法可以被子類中的靜態(tài)方法覆蓋,但是沒有多態(tài)。
             使用引用調(diào)靜態(tài)方法,相當于使用引用的類型去調(diào)用靜態(tài)方法。(在使用對象調(diào)用靜態(tài)方法是其實是調(diào)用編譯時類型的靜態(tài)方法)


    2、靜態(tài)屬性:全類公有,稱為類變量
                 那么這個屬性就可以用  類名.屬性名  來訪問
                 (共有的類變量與對象無關,只和類有關)
       類加載:虛擬機通過I/O流把一個類的信息從字節(jié)碼文件中讀入虛擬機并保存起來  
               一個類只會加載一次
       類變量,會在加載時自動初始化,初始化規(guī)則和實例變量相同。
       注意:類中的實例變量是在創(chuàng)建對象時被初始化的,被static修飾的屬性,也就是類變量,是在類加載時被創(chuàng)建并進行初始化,類加載的過程是進行一次。也就是類變量只會被創(chuàng)建一次。
            
    3、初始代碼塊
       在定義屬性的位置上,在任何方法之外,定義一個代碼塊  
       動態(tài)初始代碼塊:在初始化屬性之前調(diào)用初始化代碼塊  {……}
       靜態(tài)初始代碼塊:在類加載時運行    static{……}  只被運行一次,往往用作一個類的準備工作
      
    二、一個類在什么時候被加載?時機  (延遲加載,能不加載就不加載)
    (1)new 一個對象的時候,加載
    (2)沒有創(chuàng)建對象,訪問類中靜態(tài)成員(方法和屬性),加載
    (3)聲明一個類的引用,不加載
    (4)創(chuàng)建子類,先加載父類,再加載子類
    (5)父類中的公開靜態(tài)方法,子類繼承,使用子類的類名調(diào)用此方法,加載父類
         class Super{
              public static m(){}
         }
         class Sub extends Super{}
         在主函數(shù)中運行以下代碼:
         Sub.m();   //加載了父類之后,虛擬機已經(jīng)知道m(xù)()方法的調(diào)用了,就不會再加載子類,延遲加載
    (6)沒有創(chuàng)建對象,訪問類中靜態(tài)常量(能計算出結果的常量,在編譯的時候會用計算出來的結果替換表達式),不加載  
         沒有創(chuàng)建對象,訪問類中靜態(tài)常量(不確定的值),加載  
    (7)CoreJava day16    
        
        
    三、設計模式(編程套路)    
       GOF(Group Of Four)四人幫模式 23種
      
    1、單例模式 Singleton:
      
       class A{
            private static A a = new A();  //私有靜態(tài)的實例變量指向自己,在類加載時創(chuàng)建唯一對象
            public static A newInstance(){ //提供公開靜態(tài)的訪問點,回返唯一實例
                return a;
            }
            private A(){}      //私有的構造方法,防止濫用
       }
      
    2、不變模式 :
       便于實例共享,減少對存儲空間的消耗
       String類采用了不變模式
       字符串中的內(nèi)容是不變的
      
       String a1 = "123";  //系統(tǒng)會先去串池中找"123",找到,就共享使用一個,沒找到就在串池中創(chuàng)建一個
       String a2 = new String("123");  //在堆空間中創(chuàng)建"123"
      
       池化的思想,把需要共享的數(shù)據(jù)放在池中(節(jié)省空間,共享數(shù)據(jù))
       只有String類可以用“”中的字面值創(chuàng)建對象。
       在String類中,以字面值創(chuàng)建時,會到串池空間中去查找,如果有就返回串池中字符串的地址,并把這個地址付給對象變量。
       如果沒有則會在串池里創(chuàng)建一個字符串對象,并返回其地址付購對象變量,當另一個以字面值創(chuàng)建對象時則會重復上述過程。
       如果是new在堆空間中創(chuàng)建String類的對象,則不會有上述的過程。
      
       a2=a1.intern();  //返回字符串在串池中的引用
      
       消極方面:字符串連接“+”,產(chǎn)生很多的中間對象
                 StringBuffer類,字符串是可變的
                 s.append("A");  //連接字符串,不創(chuàng)建中間對象
                 大量字符串連接的時候用StringBuffer取代String
      
      
    四、final
    修飾變量,方法,類

    1、修飾變量
       被fianl修飾的變量就是常量(常量名大寫),一旦賦值不能改變  
       修飾局部變量:修飾基本數(shù)據(jù)類型 -> 變量的值不能改變
                     修飾引用 -> 引用只能指向固定的對象
       修飾實例變量:默認值不生效,可以再賦值
                     有兩次賦值機會:初始化變量的時候 final int a = 20;  對于直接在初始化時賦值,final修飾符常和static修飾符一起使用,避免浪費空間
                                     構造方法中設置  this.a = a;
                                     但是不能同時使用這兩種方法                                                                
                     在一個對象完成創(chuàng)建的時候,對象中的所有final屬性必須都完成賦值
       類變量可以是final的,也有兩次賦值機會 :定義變量的時候就賦值 ; 靜態(tài)初始代碼塊中    

      
    2、修飾類
        不能被繼承  
        在樹狀單繼承關系中,final類是樹葉節(jié)點
        在一個final類中的所有方法,默認都是final的
        
      注意:final,不能用來修飾構造方法。
            在父類中如果有常量屬性,在子類中使用常量屬性時是不會進行父類的類加載。
            靜態(tài)常量如果其值可以確定,就不會加載該類,如果不能確定則會加載該常量所在的類。  
            class Super{
               private final void m(){}   //用final可以證明出private的方法不繼承給子類
            }
            class Sub extends Super{
               public void m(){}  //不是方法的覆蓋
            }        

    3、修飾方法                
        不能被子類覆蓋  
        從面向對象的角度理解,可以保持操作的穩(wěn)定性
            
    五、abstract 抽象的
      修飾類和方法            
      
    1、修飾類 ->  抽象類
        不能創(chuàng)建對象,可以聲明引用,并通過引用調(diào)用類中的方法
        主要用于被子類繼承的,可以用父類引用指向子類對象
        
    2、修飾方法
        只有聲明,沒有實現(xiàn),用“;”代替“{ }”    
        需要子類繼承實現(xiàn)(覆蓋)。
        
        如果一個類中有抽象方法,那么這個類必須是抽象類。
        抽象類中不一定有抽象方法
          
        注意:父類是抽象類,其中有抽象方法,子類繼承父類,必須把父類中的所有抽象方法都實現(xiàn)(覆蓋)了,子類才有創(chuàng)建對象的能力,
              否則子類也必須是抽象類。
              抽象類中可以有構造方法,是子類在構造子類對象時需要調(diào)用的父類(抽象類)的構造方法。
              
       抽象類的合理性:
          沒有抽象類的實例,只有抽象類子類的實例
          抽象方法,定義和實現(xiàn)分離    
          
          抽象(abstract)方法代表了某種標準,定義標準,定義功能,在子類中去實現(xiàn)功能(子類繼承了父類并需要給出從父類繼承的抽象方法的實現(xiàn))。
          方法一時間想不到怎么被實現(xiàn),或有意要子類去實現(xiàn)而定義某種標準,這個方法可以被定義為抽象。(abstract)  
          
    六、三個修飾符都能修飾方法(不包含構造方法)
    1、構造方法在創(chuàng)建對象的時候使用,如果是static,那么只會在加載類的時候調(diào)用一次
       構造方法不能被繼承(final),談不到覆蓋,更不會由子類實現(xiàn)(abstract)
    2、final和abstract,private和abstract,static和abstract,這些是不能放在一起的修飾符
       因為abstract修飾的方法是必須在其子類中實現(xiàn)(覆蓋),才能以多態(tài)方式調(diào)用,以上修飾符在修飾方法時子類都覆蓋不了這個方法。
       final是不可以覆蓋,private是不能夠繼承到子類,所以也就不能覆蓋。
       static是可以覆蓋的,但是在調(diào)用時會調(diào)用編譯時類型的方法(引用類型的方法),因為調(diào)用的是父類的方法,而父類的方法又是抽象的方法,不能調(diào)用。
       所以上的修飾符不能放在一起。          

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多