隨筆-126  評(píng)論-247  文章-5  trackbacks-0

             
          一、static

          static 可以用來修飾變量、方法、代碼塊。

          1. static 修飾變量:

             被 static 修飾的變量叫靜態(tài)變量類變量, 沒有被 static 修飾的變量叫實(shí)例變量。
            
             在運(yùn)行時(shí)期, JVM 在加載類的時(shí)候?qū)⑼瓿蓪?duì)靜態(tài)變量/類變量分配一次內(nèi)存空間, 且在內(nèi)存上只存在一份拷貝, 類的所有實(shí)例將共享這份拷貝。

             靜態(tài)變量/類變量獨(dú)立于該類的任何對(duì)象, 它不依賴類的特定實(shí)例, 可以通過類名來訪問得到, 也可以通過實(shí)例名來訪問(不建議)。

             而對(duì)于實(shí)例變量, 是每次創(chuàng)建類的實(shí)例的時(shí)候都會(huì)為實(shí)例變量分配一次內(nèi)存空間, 實(shí)例變量在內(nèi)存上可能存在多個(gè)拷貝, 但它們之間互不影響。

          2. static 修飾方法

             被 static 修飾的方法稱為靜態(tài)方法, 與靜態(tài)變量相似的, 它獨(dú)立于該類的任何對(duì)象, 它不依賴類的特定實(shí)例。
           
             因此靜態(tài)方法中不能使用 this、super 關(guān)鍵字, 也不能調(diào)用非靜態(tài)的變量或方法(因?yàn)榉庆o態(tài)是需依賴于具體的實(shí)例, 如果調(diào)用, 則不能保證其被正確初始化,

             而 Java 編譯器是不允許你這么做的)。靜態(tài)方法可以通過類名來訪問得到, 也可以通過實(shí)例名來訪問(不建議)。

          3. static 修飾代碼塊

             被 static 修飾的代碼塊叫靜態(tài)代碼塊, JVM 在加載類的時(shí)候就會(huì)執(zhí)行這些靜態(tài)代碼塊, 而且只會(huì)被執(zhí)行一次, 因此靜態(tài)代碼塊會(huì)比類的構(gòu)造方法優(yōu)先執(zhí)行。

             如果一個(gè)類中的靜態(tài)代碼塊有多個(gè),JVM 將按照它們?cè)陬愔谐霈F(xiàn)的先后順序依次執(zhí)行它們。

          二、final

          final 譯成中文是最終的和不可更改的意思, 它可以用來修飾非抽象類, 非抽象成員方法和變量。

          1. final 修飾類

             final 不能用來修飾 abstract 的類, 不能被繼承, 它是頂級(jí)類, 沒有子類, 像我們常用的 String 類

          2. final 修飾變量

             final 用來修飾變量, 那就意味著該變量一旦初始化完成, 那么它的值就不能夠再被改變。

             因此, final 修飾的變量必須由程序員手動(dòng)去做初始化給變量賦值, 而且初始化的位置只能是: 定義處、構(gòu)造方法、普通代碼塊(不能是靜態(tài)代碼塊)。

             而且這三個(gè)位置中只能選擇一處來做初始化。

             [小延伸: 普通代碼塊實(shí)際上會(huì)被提取到構(gòu)造方法中來執(zhí)行, 而且會(huì)比構(gòu)造方法體內(nèi)的代碼優(yōu)先執(zhí)行。]

          3. final 修飾方法

             final 用來修飾方法表示不允許其子類來覆蓋這個(gè)方法。

             final 不能用來修飾構(gòu)造器(構(gòu)造方法、構(gòu)造函數(shù)、構(gòu)造子), 因?yàn)楦割惖臉?gòu)造器不能夠被繼承, 類內(nèi)的 private 方法也不能夠被子類繼承,

             也就不存在覆蓋之說法, 覆蓋僅適用于成員方法, private 修飾的方法實(shí)際上默認(rèn)也是 final 類型的。

          三、transient

          這個(gè)比較陌生, 其實(shí)我壓根就沒用過.... -_-|| 在 java 源碼里見到過, 不過沒有用到的東西向來學(xué)了就忘的很干脆, 這次是為了找工作, 重新整理一遍。

          @Transient 相信很多人都認(rèn)識(shí)這個(gè), 在編一個(gè)實(shí)體類寫 JPA(Java Persistence API, Java 持久化 API)注解的時(shí)候, 會(huì)常常用到這個(gè)注解。

          而這里的 transient 和 @Transient 的作用很相似:

          Java 的 Serializable 提供了一種持久化對(duì)象實(shí)例的機(jī)制。當(dāng)一個(gè)對(duì)象發(fā)生持久化時(shí), 可能會(huì)有一些特殊的數(shù)據(jù)成員,

          是我們不希望用 Serializable 機(jī)制來保存的。為了在一個(gè)特定對(duì)象的一個(gè)或多個(gè)域上關(guān)閉持久化, 可以在這個(gè)域前加上關(guān)鍵字 transient。
            
          transient 是 Java 的關(guān)鍵字, 用來表示一個(gè)域不是該對(duì)象串行化的一部分。當(dāng)一個(gè)對(duì)象被串行化的時(shí)候, 被聲明成 transient 的變量的值

          不會(huì)包括在串行化里面。 

          示例:

            
          package test;

          import java.io.Serializable;

          public class Admin implements Serializable{

              
          private static final long serialVersionUID = 1L;
              
          private String name;
              
          private transient String nickname;
              
              
          public String getName() {
                  
          return name;
              }
              
              
          public void setName(String name) {
                  
          this.name = name;
              }
              
              
          public String getNickname() {
                  
          return nickname;
              }
              
              
          public void setNickname(String nickname) {
                  
          this.nickname = nickname;
              }
              
          }
            

           


             
          package test;
          /**
           * <!--
           * Author : fancy
           * Email  : fancydeepin@yeah.net
           * Date   : 2013-02-07
           * --!>
           
          */
          import java.io.FileInputStream;
          import java.io.FileOutputStream;
          import java.io.ObjectInputStream;
          import java.io.ObjectOutputStream;

          public class AdminTest {

              
          public static void main(String[] args) throws Exception{
                  
                  Admin admin 
          = new Admin();
                  admin.setName(
          "店小三");
                  admin.setNickname(
          "小菜一疊");
                  writeObject(admin);
                  System.out.println(
          "<------------- 序列化之前 ------------->");
                  System.out.println(
          "姓名: " + admin.getName());
                  System.out.println(
          "昵稱: " + admin.getNickname());
                  admin 
          = (Admin)readObject();
                  System.out.println(
          "<------------- 反序列化后 ------------->");
                  System.out.println(
          "姓名: " + admin.getName());
                  System.out.println(
          "昵稱: " + admin.getNickname());
                  
          /**
                   * 控制臺(tái)執(zhí)行輸出結(jié)果:
                   * 
                   * <------------- 序列化之前 ------------->
                   * 姓名: 店小三
                   * 昵稱: 小菜一疊
                   * <------------- 反序列化后 ------------->
                   * 姓名: 店小三
                   * 昵稱: null
                   
          */
              }
              
              
          //序列化
              public static void writeObject(Object obj) throws Exception{
                  ObjectOutputStream oos 
          = new ObjectOutputStream(new FileOutputStream("admin.ser"));
                  oos.writeObject(obj);
              }
              
              
          //反序列化
              public static Object readObject() throws Exception{
                  ObjectInputStream ois 
          = new ObjectInputStream(new FileInputStream("admin.ser"));
                  
          return ois.readObject();
              }
          }
             


           



            
          posted on 2013-02-07 12:14 fancydeepin 閱讀(1908) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 阳新县| 辽阳县| 南岸区| 永平县| 静宁县| 甘谷县| 连云港市| 大宁县| 克东县| 芦山县| 清水县| 嘉义市| 元朗区| 瓮安县| 昭平县| 万源市| 田东县| 邢台市| 晋州市| 河津市| 社会| 汉源县| 郎溪县| 林口县| 开化县| 龙井市| 江源县| 洛浦县| 万年县| 巩留县| 桐庐县| 台南市| 日照市| 称多县| 金山区| 永州市| 射洪县| 沾益县| 秦安县| 蒲城县| 贺州市|