<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Flyingis

    Talking and thinking freely !
    Flying in the world of GIS !
    隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0
    數據加載中……

    Java接口特性學習

    作者:Flyingis

        在
    Java中看到接口,第一個想到的可能就是C++中的多重繼承和Java中的另外一個關鍵字abstract。從另外一個角度實現多重繼承是接口的功能之一,接口的存在可以使Java中的對象可以向上轉型為多個基類型,并且和抽象類一樣可以防止他人創建該類的對象,因為接口不允許創建對象。

     

    interface關鍵字用來聲明一個接口,它可以產生一個完全抽象的類,并且不提供任何具體實現。interface的特性整理如下:

    1.        接口中的方法可以有參數列表和返回類型,但不能有任何方法體。

    2.        接口中可以包含字段,但是會被隱式的聲明為staticfinal

    3.        接口中的字段只是被存儲在該接口的靜態存儲區域內,而不屬于該接口。

    4.        接口中的方法可以被聲明為public或不聲明,但結果都會按照public類型處理。

    5.        當實現一個接口時,需要將被定義的方法聲明為public類型的,否則為默認訪問類型,Java編譯器不允許這種情況。

    6.        如果沒有實現接口中所有方法,那么創建的仍然是一個接口。

    7.        擴展一個接口來生成新的接口應使用關鍵字extends,實現一個接口使用implements

     

    interface在某些地方和abstract有相似的地方,但是采用哪種方式來聲明類主要參照以下兩點:

    1.        如果要創建不帶任何方法定義和成員變量的基類,那么就應該選擇接口而不是抽象類。

    2.        如果知道某個類應該是基類,那么第一個選擇的應該是讓它成為一個接口,只有在必須要有方法定義和成員變量的時候,才應該選擇抽象類。因為抽象類中允許存在一個或多個被具體實現的方法,只要方法沒有被全部實現該類就仍是抽象類。

     

    以上就是接口的基本特性和應用的領域,但是接口絕不僅僅如此,在Java語法結構中,接口可以被嵌套,既可以被某個類嵌套,也可以被接口嵌套。這在實際開發中可能應用的不多,但也是它的特性之一。需要注意的是,在實現某個接口時,并不需要實現嵌套在其內部的任何接口,而且,private接口不能在定義它的類之外被實現。

     

    posted @ 2005-11-02 21:18 Flyingis 閱讀(5076) | 評論 (0)編輯 收藏

    多態學習心得

    作者:Flyingis

        這幾天我在重新復習
    Java語言基礎,雖然和團隊一起,自己個人都進行了實際項目的開發,但越往上面走越覺得自己應該花點時間看看Java的基礎知識,鞏固一下基礎。今天復習的是多態,同時寫下自己的學習心得。

    數據抽象、繼承和多態是面向對象程序設計語言的三大特性。多態,我覺得它的作用就是用來將接口和實現分離開,改善代碼的組織結構,增強代碼的可讀性。在某些很簡單的情況下,或許我們不使用多態也能開發出滿足我們需要的程序,但大多數情況,如果沒有多態,就會覺得代碼極其難以維護。

    Java中,談論多態就是在討論方法調用的綁定,綁定就是將一個方法調用同一個方法主體關聯起來。在C語言中,方法(C中稱為函數)的綁定是由編譯器來實現的,在英文中稱為early binding(前期綁定),因此,大家自然就會想到相對應的late binding(后期綁定),這在Java中通常叫做run-time binding(運行時綁定),我個人覺得這樣稱呼更貼切,運行時綁定的目的就是在代碼運行的時候能夠判斷對象的類型。通過一個簡單的例子說明:

    /**

     * 定義一個基類

     */

    public Class Parents {

      public void print() {

        System.out.println(“parents”);

    }

    }

    /**

     * 定義兩個派生類

     */

    public Class Father extends Parents {

      public void print() {

        System.out.println(“father”);

    }

    }

    public Class Mother extends Parents {

      public void print() {

        System.out.println(“mother”);

    }

    }

    /**

     * 測試輸出結果的類

     */

    public Class Test {

      public void find(Parents p) {

        p.print();

    }

    public static void main(String[] args) {

      Test t = new Test();

      Father f = new Father();

      Mother m = new Mother();

      t.find(f);

      t.find(m);

    }

    }

    最后的輸出結果分別是fathermother,將派生類的引用傳給基類的引用,然后調用重寫方法,基類的引用之所以能夠找到應該調用那個派生類的方法,就是因為程序在運行時進行了綁定。

    學過Java基礎的人都能很容易理解上面的代碼和多態的原理,但是仍有一些關鍵的地方需要注意的,算是自己對多態的一個小結:

    1.        Java中除了staticfinal方法外,其他所有的方法都是運行時綁定的。在我另外一篇文章中說到private方法都被隱式指定為final的,因此final的方法不會在運行時綁定。當在派生類中重寫基類中staticfinal、或private方法時,實質上是創建了一個新的方法。

    2.        在派生類中,對于基類中的private方法,最好采用不同的名字。

    3.        包含抽象方法的類叫做抽象類。注意定義里面包含這樣的意思,只要類中包含一個抽象方法,該類就是抽象類。抽象類在派生中就是作為基類的角色,為不同的子類提供通用的接口。

    4.        對象清理的順序和創建的順序相反,當然前提是自己想手動清理對象,因為大家都知道Java垃圾回收器。

    5.        在基類的構造方法中小心調用基類中被重寫的方法,這里涉及到對象初始化順序。

    6.        構造方法是被隱式聲明為static方法。

    7.        用繼承表達行為間的差異,用字段表達狀態上的變化。

    posted @ 2005-10-31 19:28 Flyingis 閱讀(1183) | 評論 (1)編輯 收藏

    用Java實現自動在數據庫表中生成ID號[原創]

        作者:Flyingis

        前段時間用Struts開發了一個B/S結構的信息管理系統,其中有一個功能是要求管理員能夠對數據字典進行修改,數據字典的表結構基本上都是table(id, name),id為數據庫其它表中所存儲的內容,表示方式為A01、A02、A08、B10、B25、C12等等,一個字典就分配一個字母作為其ID號的標識,其實就是為了調試時方便,在其它的表中判斷該字典的名稱。因此對于一個特定的字典表來說,其ID號排序應該是A01、A02、A03、A04…… 

        在對字典內容進行刪除的時候并不需要考慮什么,直接使用DELETE語句就可以了。關鍵是添加字典信息時,管理員需要在表單中填寫的是table中的name字段,ID號如何生成就需要自己用代碼來實現(包括ID號的01號空缺,中間有斷開等情況)。下面是我設計的代碼,其中關鍵的地方都有詳細的注釋:

    /* 
     * 功能:增加字典信息時,自動生成最小的ID號碼
     * 參數:String 字典表名稱 first 字典ID的首字母,代表唯一的字典
     * 返回:String 生成的最小ID號碼
     */
    public String getId(String table, String first) {

    // 所有除去首字母后的ID號碼--整型,例如:11
    int[] sid;
    // 所有原始ID號碼,例如:A11
    String[] rid;
    // 除去首字母后最小的ID號碼--字符串
    String sid_new = null;
    // 程序返回的最小的原始ID號碼
    String rid_new = null;

            // 循環參數
    int i = 0;
    int k = 0;

    con = DatabaseConnection.getConnection("jdbc/wutie");
    Statement stm = null;
    ResultSet rst = null;
    RowSet rowRst = null;
    String sql = "SELECT * FROM " + table + " order by id";

    try {
        if (con.isClosed()) {
            throw new IllegalStateException("error.sql.unexpected");
        }
        stm = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        rst = stm.executeQuery(sql);
        
        while (rst.next()) {
         k++;
         }
        sid = new int[k];
        rid = new String[k];
        rst = stm.executeQuery(sql);
        // 如果不存在結果集,則直接在first字母后面加01,例如first="A",rid_new=A01
        if (!rst.first()) {
         rid_new = first.concat("01");
         return rid_new;
         }
                // 如果存在結果集,則將表中所有ID號存入數組中,并轉換為整型數據
        else {
         /*
        while (rst.next()) {
            rid[i] = rst.getString("id");
            sid[i] = Integer.parseInt(rid[i].substring(1));
            i++;
            }
            */
         for (rst.previous(); rst.next(); i++) {
         rid[i] = rst.getString("id");
         sid[i] = Integer.parseInt(rid[i].substring(1));
         }
         // 如果第一條記錄ID號不為fisrt+01,例如A03、A05、A18等,則返回新增數據的ID號為A01
         if (sid[0] != 1) {
         rid_new = first.concat("01");
         return rid_new;
         }
         // 如果第一條記錄ID號為first+1,即A1,則執行下面語句
        else {
         // 如果總記錄數只有一條,例如A1,則返回新增數據為A02
         if (i == 1) {
         rid_new = first.concat("02");
         return rid_new;
         }
         else {
        for (int j = 1; j < k; j++) {
         // 如果相鄰兩條記錄ID號的整數位相差1,則保存新增數據ID號整數位是前一位ID號整數位加1
         if (sid[j] == sid[j-1] + 1) {
         if (sid[j] < 9) {
         sid_new = String.valueOf(sid[j] + 1);
        rid_new = first.concat("0").concat(sid_new);
         }
         else {
         sid_new = String.valueOf(sid[j] + 1);
        rid_new = first.concat(sid_new);
         }
         }
    // 如果相鄰兩條記錄ID號的整數位相差非1,則返回新增數據ID號整數位是前一位ID號整數位加1
    if (sid[j] != sid[j-1] + 1) {
    if (sid[j-1] < 9) {
        sid_new = String.valueOf(sid[j-1] + 1);
        rid_new = first.concat("0").concat(sid_new);
        return rid_new;
    }
    else {
        sid_new = String.valueOf(sid[j-1] + 1);
        rid_new = first.concat(sid_new);
        return rid_new;
    }
        }
    }
        return rid_new;
         }
         }
         }     
    }
    catch (SQLException e) {
    e.printStackTrace();
    throw new RuntimeException("error.sql.runtime");
    }
    finally {
    try {
    stm.close();
    con.close();
    }
    catch (SQLException e1) {
    e1.printStackTrace();
    throw new RuntimeException("error.sql.runtime");
    }
    }

    }
        
        注意:之所以生成A01而不是A1,是因為在SQLServer2000中根據ID號正確排序的需要,如果按照升序排列,A1后面是A10、A11等,而不是A2。另外,在Hibernate中有多種自動生成ID字段的方法,但是這個項目比較小,我沒有使用Hibernate中間件,這里提供的只是生成字典ID字段的一種簡單思路,只能用于字典項不多于100項的情況,一般的情況可以滿足了,但如果超過100項只需簡單修改一下代碼,不足之處還請大家多指教!

    posted @ 2005-10-31 11:37 Flyingis 閱讀(1076) | 評論 (1)編輯 收藏

    小議final關鍵字

    作者:Flyingis

          final
    Java語言中一個很微妙的關鍵字,而使用它通常出于兩種理由:設計與效率。我們可以對數據成員、方法和類使用final關鍵字。
       
    final數據的聲明是為了告訴編譯器有一塊數據是恒定不變的。對于基本數據類型,編譯器可以將該常量值代入任何可能用到它的計算式中去,即可以在編譯時執行計算,這樣就減輕了一些運行時的負擔。在對這個常量進行定義的時候,必須對其進行賦值,當然也可以在類的構造函數中賦值。當對對象引用使用final聲明時,其含義容易讓人迷惑,因為對于對象的引用,final可以使引用恒定不變,它可以使該引用始終指向一個對象,但是,對象自身是可以被修改的,所以在這種情況下感覺final幾乎沒什么作用,數組也是對象,它也存在這種情況,通過下面這個例子說明:


    class Fruit {

      private final int[] m = {1, 2, 3};

      public static void main(String[] args) {

    Fruit f = new Fruit();

    for(int i = 0; i < m.length(); i++) {

      f.m[i]++;  //可以改變

    }

    f.m = new int[5];  //不能指向另外的一個對象,錯誤!

    }

    }

        對基本數據類型的數據使用
    final的另外一個用處就是可以做到根據對象的不同而使類的功能發生改變,例如:

    class Apple {

      private final int i;  //沒有初始化,需要在構造函數中賦值

      private static Random r = new Random();

      public Apple() {

        i = r.newInt(10);

    }

    public Apple(int j) {

      i += j;

    }

    }

        使用final方法,可以把方法鎖定,防止繼承類修改它。并且使用方法類在一般情況下可以提高效率,讓編譯器將針對該方法的所有調用都轉為內嵌式的調用,即以方法體中的實際代碼來代替方法調用的代碼,這樣就消除了方法調用的開銷。但是對于private類型的方法而言意義不大,因為private方法都已經被隱式的制定為final,如果繼承類試圖將該方法聲明為public/protected/默認的同名方法,將不能覆蓋基類中的方法,這樣做是聲明了一個新的方法,這是Java中的多態,但是也說明了private方法將不會起到什么作用。
       
    final類的設計是為了防止以后對該類進行變動,并不希望它有子類,在final類中所有的方法都隱式指定為final的,并且這些方法無法被覆蓋,而final類的字段將保持原義,不受final類的影響!

       
    這段時間在重新復習Java中的基本細節與概念,歡迎拍磚!共同學習!

    posted @ 2005-10-28 21:50 Flyingis 閱讀(2372) | 評論 (1)編輯 收藏

    在Linux下安裝JDK及環境設置

    作者:Flyingis

    我在Fedora Core 3上已經成功安裝了jdk(jdk-1_5_0_02-linux-i586.rpm),其它版本的Linux基本相同,過程如下:

    1. 先從網上下載jdk(jdk-1_5_0_02-linux-i586.rpm) ,推薦SUN的官方網站www.sun.com,下載后放在/home目錄中,當然其它地方也行。

    進入安裝目錄
    #cd /home
    #cp jdk-1_5_0_02-linux-i586.rpm /usr/local
    #cd /usr/local
    給所有用戶添加可執行的權限
    #chmod +x jdk-1_5_0_02-linux-i586.rpm.bin
    #./jdk-1_5_0_02-linux-i586.rpm.bin
    此時會生成文件jdk-1_5_0_02-linux-i586.rpm,同樣給所有用戶添加可執行的權限
    #chmod +x jdk-1_5_0_02-linux-i586.rpm
    安裝程序
    #rpm -ivh jdk-1_5_0_02-linux-i586.rpm
    出現安裝協議等,按接受即可。

    2.設置環境變量。
    #vi /etc/profile
    在最后面加入 
    #set java environment
    JAVA_HOME=/usr/java/jdk-1_5_0_02
    CLASSPATH=.:$JAVA_HOME/lib.tools.jar
    PATH=$JAVA_HOME/bin:$PATH
    export JAVA_HOME CLASSPATH PATH
    保存退出。

    要使JDK在所有的用戶中使用,可以這樣:
    vi /etc/profile.d/java.sh
    在新的java.sh中輸入以下內容: 
    #set java environment
    JAVA_HOME=/usr/java/jdk-1_5_0_02
    CLASSPATH=.:$JAVA_HOME/lib/tools.jar
    PATH=$JAVA_HOME/bin:$PATH
    export JAVA_HOME CLASSPATH PATH
    保存退出,然后給java.sh分配權限:chmod 755 /etc/profile.d/java.sh

    3.在終端使用echo命令檢查環境變量設置情況。
    #echo $JAVA_HOME
    #echo $CLASSPATH
    #echo $PATH

    4.檢查JDK是否安裝成功。
    #java -version
    如果看到JVM版本及相關信息,即安裝成功!

    posted @ 2005-10-28 15:59 Flyingis 閱讀(86543) | 評論 (27)編輯 收藏

    Java中存儲數據的地方

       作者:Flyingis

       在
    Java
    程序運行時有6個地方可以存儲數據:

    1.寄存器:這是最快的存儲區,因為它位于不同于其他存儲區的地方——處理器內部。
    2.
    堆棧:位于通用RAM中,但通過堆棧指針可以從處理器那里獲得直接支持。
    3.
    堆:一種通用的內存池(也位于RAM),用于存放所有的Java對象。
    4.
    靜態存儲:這里的靜態指的是在固定的位置”(盡管也在RAM),存放程序運行時一直存在的數據。
    5.
    常量存儲:常量值通常直接存放在程序代碼內部,這樣做是安全的,因為它們永遠不會被改變。
    6.
    RAM存儲:如果數據完全存活于程序之外,那么它可以不受程序的任何控制,在程序中沒有運行時也可以存在。

           
    Java程序設計時經常用到一系列類型,比如char/byte/int/long/float等等,我們有兩種方式創建方式,例如創建一個String類型的引用并初始化為“Java”

            String s = "Java";
           
     String s = new String("Java");

           
    采用第一種方式創建了一個并非是引用的變量,它的值為“Java”,置于堆棧之中。而第二種方式創建了一個對象,它被存儲在堆里,不及在堆棧中高效。因此,當我們需要創建一個很小的、簡單的變量時,采用第一種方式更好。這是Java數據存儲的一個細節。

    posted @ 2005-10-28 15:48 Flyingis 閱讀(959) | 評論 (3)編輯 收藏

    僅列出標題
    共6頁: 上一頁 1 2 3 4 5 6 
    主站蜘蛛池模板: 亚洲女同成av人片在线观看| 99999久久久久久亚洲| 一级毛片免费视频| 亚洲丰满熟女一区二区v| 在线观看国产情趣免费视频| 一级成人生活片免费看| 亚洲精品视频免费看| 国产国产人免费人成免费视频| 中文毛片无遮挡高清免费| 亚洲欧洲国产成人精品| 亚洲精品乱码久久久久久不卡| 18未年禁止免费观看| 特级aaaaaaaaa毛片免费视频| 亚洲欧洲日韩国产综合在线二区| 日韩高清免费观看| 无码av免费一区二区三区试看| 亚洲国产成人无码AV在线| 亚洲国产精品国自产拍AV| 在线观看免费毛片| 无码少妇精品一区二区免费动态| 亚洲欧洲无卡二区视頻| 亚洲AV福利天堂一区二区三| 国产特级淫片免费看| 午夜免费福利小电影| 黄色片网站在线免费观看| 亚洲一卡二卡三卡四卡无卡麻豆| 国产av无码专区亚洲av果冻传媒| 中文字幕影片免费在线观看| 国产日韩AV免费无码一区二区| 亚洲欧美综合精品成人导航| 亚洲伊人久久大香线蕉苏妲己| 四虎精品亚洲一区二区三区| 国产卡一卡二卡三免费入口| 欧洲人成在线免费| 一道本不卡免费视频| 亚洲精品国产第一综合99久久| 亚洲精品中文字幕麻豆| 亚洲精品无码专区在线在线播放| 免费永久看黄在线观看app| 美女视频黄的全免费视频| 无码精品国产一区二区三区免费|