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

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

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

    2013年1月13日

    JAVA語法復習

    工作原理
    1)編寫.java文本文件;
    2)通過編譯器編譯為.class二進制文件;
    3)使用JAVA虛擬機執行.class文件,不同平臺對應不同虛擬機;
    System.exit:main方法結束不等于整個程序的真正結束,可能還有線程在運行著,調用System.exit()才達到程序的真正結束。


    面向對象原理
    單繼承,多接口實現;一般,繼承主要用在一個系列的對象抽象;接口主要針對功能的抽象;
    JAVA語言中,并非所有的變量都是對象,基本的數值類型(char,short,int,long,float,double,boolean)除外,可能是為了運行速度,編譯器沒有將這些類型編譯為對象;
    對象Object是所有對象的祖宗;
    對象Class保存一個對象的類型信息,也可以是基本的數值類型;


    數據類型
    int         4B
    short       2B
    long        8B
    byte        1B
    float       4B (后綴f,F)
    double      8B (后綴d,D)
    char        2B
    boolean     1B
    前綴:
    0x:十六進制 (指數用p,十進制用e)
    0:八進制


    變量命名
    字母(a-zA-Z)、下劃線(_)開頭,后續字母可以是字母、數字、下劃線,不能是關鍵字或者保留字。


    關鍵字
    abstract, assert, boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, extends, final, finally, float, for, goto, if,

    implements, import, instanceof, int, interface, long, native, new, null, package, private, protected, public, return, short, static, strictfp, super, switch,

    synchronized, this, throw, throws, transient, try, void, volatile, while
    其中,const和goto是保留關鍵字。


    注釋
    //行注釋


    運算符
    算術運算:+、-、*、/、%;++、--、+=、-=;
    關系運算:>、<、==、>=、<=、!=、!、&&、||;
    位運算:&、|、^、~、>>、>>>、<<、<<<;


    流程控制
    if ... else ...
    (...) ? ... : ...;
    switch  只能接受byte、short、char、int四種,不能接受long類型。
    for
    for each
    while
    do...while


    參數傳遞
    基本數據類型按照值傳遞,對象按照引用傳遞;String對象沒有修改該對象的方法,如果要通過引用修改可以使用StringBuilder或StringBuffer;


    面向對象
    類加載:static字段、一般字段、構造函數字段;(注意:static成員是類加載器加載的,是線程安全的;)
    繼承;
    接口;
    內部類、匿名內部類用途:使用一個對象去做任務處理,但是該對象以后也不需要用到;這樣在一個類A內部定義一個內部類B,這樣類B可以訪問類A的數據,外界并不知道有類B的存在;
    異常繼承時候,父類與子類的異常聲明可以不同,但是子類的異常必須在父類的異常范圍之內,也就是父類的異常必須可以引用子類的異常;
    方法繼承時候,如果需要覆蓋,方法名稱、形參類型、返回類型必須相同;


    訪問修飾符
               當前對象    同一個包中子類/非子類     其它包中子類/非子類
    private    yes         no/no                     no/no
    protected  yes         yes/yes                   yes/no
    默認       yes         yes/yes                   no/no
    public     yes         yes/yes                   yes/yes


    對象比較
    使用==比較的是引用;使用equals默認比較的也是對象的引用,但是,經過重載的equals可以按照我們需要去比較特點字段;
    String類重載了equals與hashCode,而StringBuilder與StringBuffer沒有經過重載,因此使用equals比較StringBuilder與StringBuffer實際比較的是引用;
    注意:重載equals必須同時重載hashCode,這兩個方法必須保持同步,即equals與hashCode同真假;


    對象序列化
    繼承接口Serializable即可以實現對象序列化,默認是序列化與反序列化的結果是相同的(引用被序列化后再反序列化回來還是跟之前相同的);
    一般序列化后,要定義字段serialVersionUID,eclipse自動可以生成;作用是保持序列化與反序列化時候的版本兼容,如果不定義該字段,當出現反序列化時候內容不同時,可能會報錯;
    transient關鍵字可以使該字段不進行序列化;


    對象克隆
    繼承接口Cloneable,然后覆蓋Object類的clone()方法進行克隆的聲明;默認是淺拷貝,若字段是引用類型,則需要手動在clone()方法里面人工進行new一個對象;
    數組默認支持克隆,但是數組的數組(二維數組以上)不支持直接使用克隆;


    異常
    異常的結構
    Throwable
            |
        Error  Exception
                                |
                   IOException等  RuntimeException

    異常的分類
    1)未檢查異常
    RuntimeException和Error及其子類。
    這類異常不需要顯式捕捉,一旦發生,它自動會拋出來,然后程序終止;當然,你也可以進行捕捉,這樣程序就可以繼續運行;
    2)已檢查異常
    Exception及其子類
    由于Exception派生的子類及Exception類多是已檢查異常,所以,Throwable類也屬于已檢查異常;這類異常必須進行捕捉,否則編譯不能通過。

    聲明已檢查異常
    例:public FileInputStream(String name) throws FileNotFoundException

    拋出已檢查異常
    例:throw new Exception("message");

    捕獲異常
    如果不捕獲的話,程序就會終止。有些時候,出現了異常,但是,我們不需要終止程序,那么就需要捕獲異常。
    try {
        // 可能拋出異常的代碼
    } catch(異常類型 e) {
        // e.printStackTrace(); // 打印異常堆棧
        // 處理
    }
    // catch語句是從上到下執行的,具體的異常應該放在上面;

    傳遞異常
    將異常傳遞下去,這樣才能不會被覆蓋;
    try {
        // access the database
    } catch(SQLException e) {
        throw new ServletException("database error.", e);
    }

    finally子句
    finally子句是一定會執行的,該子句主要用于回收一些資源。


    泛型(屬于底層代碼,不常用)
    JAVA虛擬機中沒有泛型,只有普通類與方法,使用泛型主要是為了方便類型轉換;還有泛型可以限定對象引用的使用;所有,泛型了解使用即可,不需要深究;
    泛型包含兩種:泛型類、泛型方法;泛型類主要用于對某個不確定類型的字段進行操作;泛型方法是指static方法中使用了泛型參數;

    泛型的翻譯
    翻譯泛型表達式
    A a = new A();
    a.setT("generic programming.");
    String str = a.getT(); // 翻譯為:String str = (String) a.getT();
    翻譯泛型方法
    public static T getMiddle(T[] a) // 翻譯為:public static Object getMiddle(Object[] objects)
    public static   T getMiddle(T[] a) // 翻譯為:public static Comparable getMiddle(Comparable[] a)
    // 默認是轉化為左邊第一個類型,所有盡量將范圍大的類型放到前面;
    復雜一點的橋方法:
    class A {
     
     private T t;
     
     public void setT(T t) {
      this.t = t;
     }
     public T getT() {
      return t;
     }
    }
    class B extends A {

     

     public void setT(String t) {
      super.setT(t);
     }
    }

    // 翻譯后:
    class A { // 父類翻譯后肯定是Object
        private Object t;
      
        public void setT(Object object) {
     t = object;
        }
      
        public Object getT() {
     return t;
        }
    }
    class B extends A {
        public void setT(String string) { // 子類肯定它的父類是String
     super.setT(string);
        }
      
        public volatile void setT(Object object) { // 橋方法,外界還是認為是Object
     setT((String) object);
        }
    }
    // 調用:
    A a = new B();
    a.setT("generic programming."); // 翻譯為:b.setT((Object) "generic programming.");

    不能使用泛型的情況
    不能使用泛型繼承異常。
    例如:public class Problem extends Exception {...}。
    不能在catch(...)中,使用catch(T t)。
    異常聲明中可以使用泛型。
    例如:public static void doWork(T t) throws T {...}。

    不能用泛型數組
    A[] arr = new A[5]; // 擦除后為:A[] arr = new A[5];

    不能將泛型類型實例化。
    class A {
     a = new T(); // 擦除后是a = new Object();我們本意卻不是這個。
     ...
    }

    類的靜態字段不能使用泛型;

    當泛型類型擦除后,創建條件不能產出沖突。
    例如:public boolean equals(T t) {...}

     

    類型限定
    子類型限定<? extends Employee>,可以讀,不能寫。
    Pair<? extends Employee> pair1 = null; // ?是Employee的子類,子類可能很多,不確定有幾個。
    Pair<Manager> pair2 = new Pair<Manager>();
    pair1 = pair2;
    pair1.getFirst(); // 操作成功,因為是“(? extends Employee) pair1.getFirst();”,
      // 相當于是“(Employee) pair1.getFirst();”。
    pair1.setFirst(new Manager()); // 編譯通不過,因為是“pair1.setFirst(? extends Employee);”
      // 相當于是“pair1.setFirst(?);” 不確定的類型。

    超類型限定<? super Employee>,可以寫,不能讀;剛好和上面相反。

    無限定通配符<?>,可以讀,不能寫;讀的時候直接轉型為Object。


    反射(屬于底層代碼,不常用)
    對象產生于類,而在JAVA虛擬機里面還保存著對類的描述,這個描述是一個Class的對象;類信息被加載到虛擬機,就會產生一個Class對象,用以描述這個類的信息;
    通過這個Class對象可以解析類的結構,這個Class對象可以從類信息來(例如:Employee.class),也可以從對象來(例如:emp.getClass());
    通過這個Class對象可以引用具體對象的字段、方法、構造器,可以完全操作一個對象;
    .class: 應該是一個指向類的Class對象的指針。
    forName(): 會調用當前線程所在的ClassLoader來裝載一個類的Class實例。
    注意:基礎類型也可以這樣使用“int.class”;


    類加載器(屬于底層代碼,不常用)
    java中的類是動態加載的,即引用到了才會被加載;
    // 三種加載方式示例
    class A{}
    class B{}
    class C{}
    public class Loader{
        public static void main(String[] args) throws Exception{
           Class aa=A.class;
           Class bb=Class.forName("B");
           Class cc=ClassLoader.getSystemClassLoader().loadClass("C");
        }
    }

    系統內默認的類加載器
    Bootstrap ClassLoader (加載rt.jar)
     |
     ExtClassLoader (加載jre/lib/ext/)
      |
      AppClassLoader (加載claspath)

    //ClassLoader實現:查找類,從父加載器向上遍歷,找不到就調用當前自定義的加載器;
    protected ClassLoader() {
     SecurityManager security = System.getSecurityManager();
     if (security != null) {
         security.checkCreateClassLoader();
     }
     // 自己實現的類加載器,默認是用系統類加載器的。
     this.parent = getSystemClassLoader();
     initialized = true;
    }

    protected ClassLoader(ClassLoader parent) {
     SecurityManager security = System.getSecurityManager();
     if (security != null) {
         security.checkCreateClassLoader();
     }
     // 傳入一個父加載器
     // 如果parent=null,那么啟動類加載器就是父親。
     this.parent = parent;
     initialized = true;
    }
     
    // 雙親委派加載的實現
    public Class<?> loadClass(String name) throws ClassNotFoundException {
     return loadClass(name, false);
    }

    protected synchronized Class<?> loadClass(String name, boolean resolve)
     throws ClassNotFoundException {
     // 先檢查該類是否已經被裝載過
     Class c = findLoadedClass(name);
     if (c == null) {
         try {
       // 向父加載器委托(加載不到拋ClassNotFoundException)
       if (parent != null) {
           c = parent.loadClass(name, false);
          
          // 最終到啟動類加載器(加載不到拋ClassNotFoundException)
       } else {
           c = findBootstrapClass0(name);
       }
         } catch (ClassNotFoundException e) {
             // 父加載器加載不到,調用我們自己設定的findClass(name)進行查找
             // 對于API提供的ClassLoader,findClass()是直接拋ClassNotFoundException
             c = findClass(name);
         }
     }
     // 是否要解析(解析符號引用為直接地址引用)
     // 一般我們用false。
     // 我的理解是使用false的話,程序啟動速度應該會有一點點提升,但是第一次執行的時候應該會慢一點點。
     // 當然,這個我們人是感覺不出來的。
     if (resolve) {
         resolveClass(c);
     }
     return c;
    }



    =====
    from
    http://blog.sina.com.cn/s/blog_667ac0360102e8ii.html

    posted @ 2013-01-13 09:29 DolveVita 閱讀(134) | 評論 (0)編輯 收藏

    Java的SystemTray類的使用方法

    Java的SystemTray類的使用方法

    JDK1.6版增加了java.awt.SystemTray類,該類表示桌面的系統托盤,這對大多數系統托盤應用已經足夠。如果這個類還是不能滿足您的需求,可以試一試JDIC (JDesktop Integration Components)。
    JDK1.6的API文檔,給出了這個類的用法。有人愿意把創建系統托盤的代碼直接放在主應用代碼中,筆者更傾向于把創建系統托盤的責任分派給一個單獨的類,這符合類的設計原則。在主應用中直接調用該類的工廠方法就可以了,結構清晰,便于維護,改動或增加系統托盤的功能,不必改動主應用代碼。
    創建系統托盤的類(TrayFactory.java)的代碼如下:

    //package com.jnmc.liang.systemtray;

    import java.awt.*;
    import java.awt.event.*;

    public class TrayFactory {
            private TrayIcon trayIcon = null;
            private Component comp = null;
            private String trayImageName = null;
            private String tooltip = null;
            
            private TrayFactory(Component comp, String trayImageName, String tooltip) {
                    this.comp = comp;
                    this.trayImageName = trayImageName;
                    this.tooltip = tooltip;
                    
                    init();
            }
            
            private void init() {
                    if (SystemTray.isSupported()) {
                            SystemTray tray = SystemTray.getSystemTray();
                            Image image  = Toolkit.getDefaultToolkit().getImage(trayImageName);
                            PopupMenu popupMenu = new PopupMenu();
                            MenuItem restoreItem = new MenuItem("還原"); 
                            MenuItem exitItem  = new MenuItem("退出");
                            
                            restoreItem.addActionListener(new RestoreItemActionListener());                        
                            exitItem.addActionListener(new ExitItemActionListener());
                            
                            popupMenu.add(restoreItem);
                            popupMenu.addSeparator();
                            popupMenu.add(exitItem);
                            
                            trayIcon = new TrayIcon(image, tooltip,  popupMenu);
                            trayIcon.addMouseListener(new TrayIconMouseListener());
                            //trayIcon.addActionListener(new TrayIconActionListener());
                                                    
                            try {
                                    tray.add(trayIcon);
                            }
                            catch (AWTException e) {
                                    System.err.println(e);
                            }
                    }
                    else {
                            //..........
                    }
            }

            private class RestoreItemActionListener implements ActionListener {
                    public void actionPerformed(ActionEvent ae) {
                            comp.setVisible(true);
                    }
            }
                    
            private class ExitItemActionListener implements ActionListener {
                    public void actionPerformed(ActionEvent ae) {
                            System.exit(0);
                    }
            }
            
            private class TrayIconMouseListener extends MouseAdapter {
                    public void mousePressed(MouseEvent me) {
                            if (me.getButton() == MouseEvent.BUTTON1) {
                                    comp.setVisible(true);
                            }
                    }
            }

            public static void createTray(Component comp, String trayImageName, String tooltip) {
                    new TrayFactory(comp, trayImageName, tooltip);
            }
    }

    這個類的構造方法是private的,因為創建該類的實例不是我們的目的,另一方面是為了方便系統托盤的創建。
    構造方法有3個參數:
    第1個參數是一個Component,這就是您所要顯示或隱藏的主窗體。當然,您把這個參數寫成Component的子類也無妨,這里是為了增加類的通用性。
    第2個參數是一個String,它是一個image文件的名稱,將來用這個文件創建托盤圖標TrayIcon。
    第3個參數也是一個String,它是工具提示字符串,當您把鼠標放到托盤圖標上的時候,托盤圖標將彈出這個字符串的內容。
    創建系統托盤的具體代碼在方法private void init()中。
    創建系統托盤的任務分為兩個步驟:
    首先創建托盤圖標(TrayIcon),其次把托盤圖標添加到系統托盤(SystemTray)中。
    Java.awt.TrayIcon提供3種構造方法創建TrayIcon實例,這里采用第三種構造方法:
                    trayIcon = new TrayIcon(image, tooltip,  popupMenu);
    其中,image對象由TrayFactory類構造方法的第二個參數trayImageName創建:
    Image image  = Toolkit.getDefaultToolkit().getImage(trayImageName);
    tooltip就是TrayFactory類構造方法的第三個參數
    由于不能朝前引用,PopupMenu對象popupMenu必須在創建trayIcon對象之前創建,并給popup菜單項添加動作監聽器來處理菜單項的動作(點擊)事件,由于處理動作事件比較簡單,這里不做具體分析,只對TrayIcon的鼠標事件做出說明。
    我們希望在托盤圖標上按下鼠標左鍵時顯示主窗體,所以必須處理托盤圖標的鼠標按下事件。我們用TrayIconMouseListener私有內部類(private inner class)來處理鼠標按下事件。不論按下鼠標左鍵還是右鍵,都會產生鼠標事件,都會引起mousePressed方法的調用,所以在這個方法中只處理左鍵而忽略右鍵,把右鍵留給popup菜單:
                            if (me.getButton() == MouseEvent.BUTTON1) {
                                    comp.setVisible(true);
                            }
    這時,就可以給init()方法中創建的TrayIcon對象trayIcon添加鼠標監聽器了:
    trayIcon.addMouseListener(new TrayIconMouseListener());
    利用TrayFactory類對主應用創建系統托盤時,只需在主應用中調用該類的工廠方法即可:
    TrayFactory.createTray(comp, trayImageName, tooltip);
    注意這一句,一定要放在適當的位置:主應用從開始啟動到啟動完畢,必須有機會執行這一句。所以建議把這一句放在主應用的構造方法中,或者干脆放在顯示主窗體的前一個語句的位置:

    //其他語句
                   JFrame mainFrame = new JFrame("測試主窗體");
                    mainFrame.getContentPane().add(otherVisibleObj, BorderLayout.CENTER);
                    mainFrame.pack();
                    TrayFactory.createTray(mainFrame, "images/icon.png", "這是工具提示");        
                    mainFrame.setVisible(true);
    下面給出一個完整的例子。
    主應用(MainApp.java)源代碼如下:

    import java.awt.*;
    import javax.swing.*;

    public class MainApp {
            private static void createAndShowGUI() {
                    JFrame mainFrame = new JFrame("測試主窗體");
                    JLabel jLabel = new JLabel("這是一個標簽", SwingConstants.CENTER);
                    jLabel.setPreferredSize(new Dimension(400, 300));
        mainFrame.getContentPane().add(jLabel, BorderLayout.CENTER);
        
                    mainFrame.pack();
                    TrayFactory.createTray(mainFrame, "images/icon.png", "你好,Java!\nHello,Java!");
                    mainFrame.setVisible(true);
            }
        
            public static void main(String[] args) {
                    String lf = UIManager.getSystemLookAndFeelClassName();
                    try {
                            UIManager.setLookAndFeel(lf);
                    } 
                    catch(Exception e) {
                    }
                    
                    javax.swing.SwingUtilities.invokeLater(new Runnable() {
                                    public void run() {
                                            createAndShowGUI();
                                    }
        });
               
    }

    為簡單起見,可以把TrayFactory.java和MainApp.java放在同一目錄下,把icon.png文件放在當前目錄的images目錄下。

    ===
    from
    http://blog.sina.com.cn/s/blog_a5f093b401018ss1.html

    posted @ 2013-01-13 09:27 DolveVita 閱讀(267) | 評論 (0)編輯 收藏

    僅列出標題  
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲大香伊人蕉在人依线| 久久亚洲国产精品123区| 亚洲一线产区二线产区精华| 小日子的在线观看免费| 亚洲国产精久久久久久久| 永久免费A∨片在线观看| 久久精品国产精品亚洲色婷婷| 中文字幕在线免费看线人| 亚洲成av人片天堂网| 91免费国产精品| 国产精品亚洲精品青青青| 国产电影午夜成年免费视频| 美女视频黄的免费视频网页| 亚洲高清视频在线| 亚洲一区二区久久| 日韩精品成人无码专区免费| 亚洲成AV人片在WWW| 亚洲成a人无码av波多野按摩| 精品国产福利尤物免费| 亚洲AV区无码字幕中文色| 日本免费人成在线网站| 亚洲精品成a人在线观看☆| 亚洲精品麻豆av| 国产成人精品无码免费看| 亚洲精品乱码久久久久久下载| 一二三四影视在线看片免费| 亚洲av无码专区在线电影天堂| 亚洲乱码中文字幕手机在线| 久久精品免费观看国产| 亚洲欧美日韩中文高清www777| mm1313亚洲精品无码又大又粗| 久久国产免费观看精品| 亚洲欧美日韩综合久久久久| 亚洲午夜福利精品久久| 亚洲视频在线观看免费视频| 国产亚洲精品美女久久久久久下载| 亚洲中文久久精品无码| 国产精品无码免费播放| a级精品九九九大片免费看| 亚洲冬月枫中文字幕在线看| 亚洲一区二区三区高清视频|