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

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

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

    隨筆-159  評論-114  文章-7  trackbacks-0
     
         摘要: 集合java.util.*一個對象,容納多個對象,用于維護一系列相似對象。數組是一種簡單集合。程序中,如何管理數據,需要一種數據結構。(數組是一種線形結構)。Java的集合框架是通過一系列接口和一些層級類形成的一套體系。通過接口來查看整個集合框架,并分類來進行學習和研究。 概述: Collection接口的一個對象會把數據按照一維線形組織。里面都是對象。List代表,會按照元素的相應順序來組織...  閱讀全文
    posted @ 2005-12-06 23:13 北國狼人的BloG 閱讀(921) | 評論 (1)編輯 收藏
         摘要: 內部類,使用內部類使編程更有層次,結構更清晰,但一切能用內部類解決的問題,外部類都能解決,只是編碼是否繁瑣的問題。內部類,是作為外部類的成員。內部類,修飾符可以為private protected static四種內部類成員內部類   局部內部類   靜態內部類   匿名內部類1.成員內部類,可以作為外部類的...  閱讀全文
    posted @ 2005-12-03 19:59 北國狼人的BloG 閱讀(439) | 評論 (0)編輯 收藏
    面向對象高級

    static,可以修飾屬性、方法、代碼塊。

    每個對象稱為類的實例,對象之間的存儲區互不干涉。

    static int data;是類變量(共享),為類開辟一個空間。共享存儲區域。

    訪問類變量,通過類名訪問。一個對象引用也可以使用靜態成員,與它的編譯時類型的類訪問,一致。

    MyClass m = new MyClass();
    m.data 《= 》MyClass.data;

    靜態方法-〉沒有當前對象概念-〉也就不允許訪問的類中的非靜態成員(實例變量)

    主方法之所以是靜態的,它是程序入口,JVM最初沒有對象,必須通過使用類名調用方法,主方法必須為靜態的。

    靜態方法不能被覆蓋。

    靜態代碼塊只執行一次。

    static 用于單例模式Singleton模式

    class DBConnection{
       
    private static DBConnection db = null;
       
    private DBConnection{}

       
    public static DBConnection getInstance(){
             
    if(db == null) db = new DBConnection();
             
    return db;
       }

    }


    final 修飾  類、屬性、方法

    修飾類,無子類,保證用戶使用的一致性。典型范例String類。

    修飾屬性或者變量一旦賦值,不得更改。

    對于對象變量來說,是不能再指向其他對象,而現有的對象內部屬性可以改變。

    會配合static一起使用,只分配一個存儲空間,只需要維護一個空間。

    public static final,是一個常量。大寫。

    class SuperClass{
          final int AGE;

          public SuperClass(){
             AGE=10;
          }
    }

    初始值0不算,需要顯示賦一次值。

    初始設定在兩個地方,1定義時直接賦值,2構造器

    靜態常量也在兩個地方設定,1初始設定,2靜態代碼塊




    final方法不能覆蓋,由于多態,一個編譯時類型對應多個運行時類型,final保證某方法的穩定性。


    private
                   左邊的修飾符有其中一個,系統都默認添加了final修飾符。
    static


    所以之前的靜態方法不能覆蓋。

    =====================
    方法繼承是決定于在子類中是否可見。能見到就是繼承。

    final不決定繼承。

    實際上如果實例化一個子類對象,它的父類對象的所有屬性(包括private成員都創建了,就是訪問不了,所以不能成為繼承的一部分,也就是不能繼承咯)



    =====================


    abstract 修飾 類 方法

    修飾類 -> 這個類必須被繼承使用->不能生成對象

    用處,把子類最大的共性提取出來放入其中,面向對象一般原則。

    雖然不能生成對象(不能作為運行時類型),但可以聲明為類型(可作為編譯時類型)。

    抽象方法,沒有實現,留給子類覆蓋。

    final永遠不可能和abstract在一起,那么private和static也不能和abstract聯合修飾。

    final表示必須不能被繼承,不能覆蓋;abstract表示必須繼承,方法沒有實現,必須覆蓋使用。所以矛盾。

    abstract class SuperClass{
          abstract void print(); //print(){},這是空實現,也是實現,所以不能帶大括號。
    }

    如果類中有抽象方法的話,那么類只能是抽象類。(一個半成品)

    如果子類沒有實現父類的抽象方法,就會編譯出錯,因為子類繼承了抽象方法,需要聲明為抽象類。

    SuperClass sc = new SubClass();

    sc.print();動態類型判定,運行時類型不會改變,肯定是一個實現抽象方法的類對象。




    接口:是同類,同一個層次的數據結構。

    interface IA{
       void print();  
       int A = 1;
    }

    修飾符省略
    一個Java文件,只能定義一個公開接口

    一個接口等同于一個抽象類

    一個特殊的抽象類:
       所有方法都是公開抽象的:public abstract
       所有屬性都是公開靜態常量:public static final

    interface IA{
       void print();  
       int A = 1;
    }

    等價于

    abstract class IA{
       public static final int A=1;
       public abstract void print();
    }

    這時可要注意,類實現接口時,覆蓋方法的訪問控制符一定要寫上public,接口是省略為public,類不寫可是default,根據Overriding規則,覆蓋方法的訪問控制等于或者大于父類方法的訪問控制。

    class IAImpl extends java.util.ArrayList implements IA{}

    1一個類除了繼承類,還可以實現接口(多個)。

    2盡管一個類只能繼承一個類,一個類可以實現多個接口

    3接口與接口之間可以繼承并可以多繼承,實現多重繼承,但復雜度不增加。

    interface IC extends IA,IB{}

    IC有著IA,IB所有方法的定義

    IA,IB可以作為編譯時類型。

    ========================

    接口,被用來定義可以***的東西。

                      存儲設備                              輸入設備
    ----|----------------|-----                     ----------|-----------
    硬盤                  U盤                                 鼠標
    ----|----
    移動硬盤

    使用接口來剝離出一部分抽象。

    移動硬盤、U盤、鼠標除了間接父類是統一的設備父類外。

    他們都是USB設備,這部分抽象就需要用接口定義。

    那么機器上的連接器是一個方法,connect(USB接口),不管你什么具體設備,你都必須實現USB規范,才能往上插。

    那么用接口來定義一個規范。


    例子2,JDBC,使用Java來訪問數據庫。

    首先,如果由Sun公司自己提供各種數據庫的驅動,那么各個DB廠商需要把數據庫核心代碼提供給Sun,這是不可能的,核心商業機密。

    而由各個DB廠商自己寫的話,會出現方法名的不同,導致如果數據庫遷移,代碼需要改動。(例如Oracle提供的方法為ConnectOracle()而ms提供的方法為ConnectSQL)。那么無法真正實現Write Once,Run Anywhere,Sun不同意。

    怎么辦?使用接口。

    由Sun和DB聯合制定一些一系列接口。

    interface Driver()
    {
          void connect();
          ...
    }

    OracleDriver implements Driver
    SQLDriver implements Driver

    實現不同的connect()邏輯。

    用戶Driver d = getDriver();
    d.connect();

    接口是實現Java一次編譯,到處運行的重要技術。

    保證了Sun制定規范,數據庫廠商實現,用戶使用。保證架構穩定性(將三方分開)

    對于用戶來說,接口最大化屏蔽差異。

    1.實現不同層次,不同體系的對象的抽象。
    2.保證架構穩定性。對用戶透明。


    ==============================

    Object 類,所有類的父類(直接,間接父類)

    finalize(),當一個對象被垃圾回收的時候,會調用一下。不適合放入釋放資源的方法。

    toString(),對象的字符串表現形式。

    System.out.println(obj);->obj.toString()

    自定義類,覆蓋該方法,返回一些有意義的信息。

    ==  判斷字面值是否相等,

    String a = new String("hello");
    String b = new String("hello");
    b==a false

    String final類,并且它的值也是immutable的。

    String a = "A"
    a = a + "B"
    這兩步操作一共產生了3個對象。

    JVM內部有一個字符串池,一個獨立存儲區域,保存已創建的字符串,如果再有相同的,會將引用指向字符串池中的已有對象,不再創建新的,如果沒有再創建。

    String a = "abc";
    String b = "abc";

    所以上面的例子是采用new String("abc")方式創建String對象,不會再去池中找,直接在堆中創建新對象。

    String a = new String("hello");
    String b = "hello";

    a為堆地址,b為串池地址,a==b,false。

    這種方式,是一種用時間換空間的做法,比如如果程序中有100個"hello",難道程序要去維護100個對象嘛。

    Object.equals   判斷對象值是否相等。

    /*
     * Student.java
     *
     * Created on 2005年12月3日, 上午10:43
     *
     * To change this template, choose Tools | Options and locate the template under
     * the Source Creation and Management node. Right-click the template and choose
     * Open. You can then make changes to the template in the Source Editor.
     
    */


    package javaapplication1;

    /**
     *
     * 
    @author Administrator
     
    */

    public class Student {
        
        String name;
        
    int age;
        
        
    /** Creates a new instance of Student */
        
    public Student() {
        }

        
        
    public Student(String n,int a){
            
    this.name = n;
            
    this.age = a;
        }

        
        
    public boolean equals(Object o)
        
    {
            Student s 
    = (Student)o;
            
    if(s.name.equals(this.name)&&s.age == this.age)
                
    return true;
            
    return false;
        }

        
    }

    自定義類如果要進行對象值的比較,覆蓋Object的equals方法,自行判斷,如果不覆蓋,直接調用Object.equals是判斷地址。

    equals方法覆蓋標準流程:

        public boolean equals(Object o)
        
    {
            
    if(this == o)
                
    return true;
            
    if(o == null)
                
    return false;
            
    if(!(o instanceof Student))
                
    return false;
            Student s 
    = (Student)o;
            
    if(s.name.equals(this.name)&&s.age == this.age)
                
    return true;
            
    return false;
        }

    double d = 10000.0d;
    Double D_d 
    = new Double(d);
    String D_S 
    = D_d.toString();//D + ""
    String d_s = String.valueOf(d);//d + ""
    double s_d = Double.parseDouble(d_s);
    Double S_D 
    = Double.valueOf(d_s);
    double d_D = D_d.doubleValue();












     

    posted @ 2005-12-02 00:03 北國狼人的BloG 閱讀(402) | 評論 (0)編輯 收藏

    面向對象三大基石:封裝,繼承,多態。面試會問到。

    Overriding  覆蓋  只存在于父子類之間,一定。

    什么時候才是覆蓋呢?

    class Father{
       public void run(){
       }
    }

    class Son extends Father{
       public void run(int a){
       }
    }

    注意:這是方法的重載,不是覆蓋!只是這個重載發生在父子類之間。

    覆蓋是,子類參數列表與返回值都與父類相同,并且子類在覆蓋父類方法時,不能給出更嚴格的訪問控制,并且子類方法例外的類型是等于父子方法拋出的異常類型,或者是其子類型。

    The exceptions thrown by an overriding method must be equal to or a subset of the exceptions thrown by the overridden method.

    注意構造方法根本不能繼承,所以不存在覆蓋的問題。

    訪問控制

    private 本類內部可見

    default 同類同包

    protected 同包+不同包子類

    要構造一個對象,先構造父類對象,再構造子類對象

    構造一個對象的執行過程。

    1.遞歸的構造父類對象-----------〉也就是說父類本身也要走這樣的步驟。
    2.順序調用成員屬性賦初值語句
    3.調用本類構造方法

    后來課程領悟,類加載與構造對象是兩回事,類加載過程,1.static靜態成員加載,2運行static一次,靜態代碼塊,3如果有靜態內部類,賦值,對靜態內部類的賦值是指編譯產生的Employee$SomeInner.class文件的讀取。

    如果類有靜態變量或者靜態塊,而且用到時(static初始化只有在必要的時候才會進行,那么就會在第一步之前執行一遍,先靜態變量,然后靜態塊,以后再怎么new都不會執行,回到創建父類開始。

    ======〉引用Think In Java

    在這里有必要總結一下對象的創建過程。請考慮一個名為Dog的類:
    (1) 類型為Dog的一個對象首次創建時,或者Dog類的static方法/static字段首次訪問時,Java解釋器必須找到Dog.class(在事先設好的類路徑里搜索)。
    (2) 找到Dog.class后(它會創建一個Class對象,這將在后面學到),它的所有static初始化模塊都會運行。因此,static初始化僅發生一次——在Class對象首次載入的時候。
    (3) 創建一個new Dog()時,Dog對象的構建進程首先會在內存堆(Heap)里為一個Dog對象分配足夠多的存儲空間。
    (4) 這種存儲空間會清為零,將Dog中的所有基本類型設為它們的默認值(零用于數字,以及boolean和char的等價設定)。
    (5) 進行字段定義時發生的所有初始化都會執行。
    (6) 執行構建器。正如第6章將要講到的那樣,這實際可能要求進行相當多的操作,特別是在涉及繼承的時候。

    =====================

    多態-1.編譯時多態      方法重載
             2.運行時多態      一個對象可能會具有多個類型

    對象是客觀的。

    人類對對象的認識是主觀的

    當人看到一個不能識別的,有生命的,區別人的東西時,會類來認識該事物。

    也就是Animal a = new Dog();子類對象可以使用父類對象來引用。

    Animal被稱為編譯時類型,而a真正的對象類型是運行時類型。

    3個原則:

    1.對象不變(運行時類型不變)(客觀的肯定不會改變)
    2.只能調用編譯時類型的方法,方法調用時,檢查編譯時類型內部是否定義了該方法。
       也就是說,在你以一個一個動物來看待一只狗時,你是不會知道它有散步的方法的。
    3.RTTI,運行時,動態類型判定(看運行時類型),子類覆蓋了(Overriding)父類方法,那么調用運行時類型對象的方法。

    a instanceof 類名(編譯時類型)
    a為對象變量
    判斷a是否被聲明為后面類的對象。
    用在強制類型轉換之前。如果轉換錯了,java.lang.ClassCastException 運行時例外

    記住,方法只有覆蓋時,調用尋找運行時類型。而Overloading ->編譯時多態->看編譯時類型。

    屬性,重載阿,都要看編譯時類型。

    package com.ljl;

    public class TestClass {
        
    public void print(B b){
            System.out.println(
    "is B");        
        }

        
    //    public void print(A a){
    //        System.out.println("is A");
    //    }
        
        
    public static void main(String[] args)
        
    {
            TestClass tc 
    = new TestClass();
            A a 
    = new B();
            tc.print(a);
        }

    }


    class A{}

    class B extends A{}

    為什么子類覆蓋父類方法時,訪問控制符只能更寬泛。因為如果父類方法為public,子類方法為private,那么多態時,察看父類方法可以調用(可調用編譯時類型所定義的方法),而動態類型判斷時,調用子類方法,發現為private,完蛋了。



    posted @ 2005-11-29 21:37 北國狼人的BloG 閱讀(405) | 評論 (0)編輯 收藏

    面向過程是以時間為順序的,組成單位是函數。

    面向對象是一套思想。它來源于人類對于客觀世界的認識的一般規律。

    1什么是對象?

    什么都是對象!客觀存在的就是對象。

    對一個事物來說,一是它有什么?(屬性)二是它能做什么?(方法)



    2為什么面向對象

    它人類看待客觀事物的一般規律。

    人看到事物,首先會想到它能做什么,功能,存在的價值。并不太關心它的屬性。

    ========================================

    要注意聯系實際來搞懂面向對象,比如面試這件事,實際上,公司是想測試你是否能提供 公司需要的方法,公司并不關心你實現的細節。錄用后,就是開始去調用你的方法。如果不能很好的實現方法,就可能被辭退。

    那么那些筆試、測試就是想看你是否有知識,知識就是屬性,記住屬性與方法之間是有聯系的,也就是沒有公司所需的知識,可以斷定這個人肯定不會有公司需要的方法。

    一個事物的方法的實現細節是對外界屏蔽的。

    那么,之前提交的簡歷是什么呢,那就是一個方法列表阿,API。比如年齡22,表明你的方法可以很好的被調用;未婚,告訴別人,你可以加班,放心用。

    項目1,2,3,每個項目后面一定要寫上你在項目中用到什么語言,否則HR的人是不知道你想告訴他們什么,他們只關心公司想要一個有JSP開發經驗,或者什么什么技術有經驗的人。您敘述一大堆項目的事情,沒有任何意義。所以簡歷不要瞎寫。

    面試是什么,就是想真正調用一下你的方法,測試一下。

    =======================================

    那么社會的運轉就是各個對象的方法的相互調用。

    方法列表公開,方法的實現細節屏蔽。

    屬性,可見和不可見

    一個方法的實現細節誰知道呢?只有這個對象的生成者。



    那么人看待客觀世界的認識,就是通過類。人類認識的是類。

    類是一系列對象的抽象,對象的模版。

    一類事物,屬性、方法。這類對象也肯定有這些屬性和方法。



    為什么面向對象的第二點,就是使得開發的系統各思其職,各盡所能。也就是低耦合,高內聚。

    為什么,電腦中的部件可以很容易的更換成為其他廠商的,就是因為主板與具體部件的連接是松散的;那為什么,可以很容易的換到其他廠商的呢,是因為各個廠商遵循著標準接口。

    比如硬盤的use(電源接口,數據接口),每個廠商都必須實現,而且硬盤是一個類的概念,有屬性,比如尺寸。

    各個廠商不能在別處下功夫,只能對硬盤內部進行調整,提高性能,才會免予被替換。

    高內聚是指完成功能的最小化。

    低耦合表現在提高了對象的復用性,比如中間件。



    最后總結一下,面向過程是先有算法,后有數據結構。由若干個過程相互調用完成。

    面向對象,則是先有數據結構,后有算法,以對象為中心,開發一系列類,拿到特定對象,通過對象之間通信,對象設計要簡單。

    類(共性)--〉對象(類允許對象在滿足共性的同時,存在個性)

    一個類,則是一個新的數據類型。



    實例變量與局部變量命名沖突,則使用局部變量,除非使用this.來指定某個屬性。

    調用構造器只是生成對象步驟的最后一步,不是構造對象本身。

    方法中使用了this,this表示當前對象,當前對象就是誰調用該方法,誰就是當前對象。

    class TestClass{
    String name;
    public void printAll(String name)
    {
       this.name = name;
    }

    }

    上面必須添加上this.來引用實例變量name。因為在局部變量和實例變量沖突時,使用局部變量。





    finalize()不是析構方法,因為不能存在真正的釋放空間操作。



    方法參數,簡單類型傳值,對象類型傳引用(一個實際存儲[堆中]的首地址)。

    假如方法中,引用賦予一個新的對象,那么方法執行完以后,該引用和實際地址消失。傳入引用所指向的對象屬性不變。



    Overloading,修飾符和返回值可以不同,但參數列表(參數類型個數或者排列順序)一定要不同。

    Overloading,是編譯時多態。那么它要看編譯時類型。

    Overloading,也存在于父與子的關系當中。父有方法,子類可以有同名方法,只有參數列表不同才是重載。

    構造器(構造方法可以重載),通過this();可以調用本類無參構造方法。
    在其他構造器調用其它構造器,那么需要this關鍵字,并且必須放置于第一行。

    如果一個類不寫任何構造函數,系統會默認添加無參空構造方法。不要依賴系統默認行為!自己最好寫上。javap查看實際代碼。


    對于簡單類型,如果調用方法傳入參數的類型不存在,那么就采用向上匹配原則進行查找。

    m(byte)不存在,就用m(short)。(實際上long是int的父類,int是short的父類)



    封裝

    屬性盡可能私有。

    方法盡可能公開。

    private只有類內部本身能訪問。

    default只有同包能訪問。

    protected只有存在繼承關系,才能訪問。

    posted @ 2005-11-28 23:43 北國狼人的BloG 閱讀(510) | 評論 (2)編輯 收藏

    模式是什么?

    模式是一個范式,一個在相同環境或者狀況下的一種通用解決辦法,解決方案。就好像孫子兵法,對于某種特定戰局,戰況下的一種派兵布陣策略和實施步驟的總結。

    模式需要什么呢?

    模式需要一個名字,一個問題域(要解決的問題),要有一個解決的方案,最后要達到什么樣的結果。

    長話短說,Observer模式,所要解決的問題就是,一個事物,當它自身的狀態改變了,那么它要通知其他的事物,而它又不能夠事先知道要通知誰,只有在Runtime時才能知道。

    舉個例子吧,鐘表和人的關系就是這樣,鐘表自身的狀態,也就是時刻改變了,它通知某些人,某些人看到或者聽到后,會做出不同的行為。而鐘表在商店里時,并不知道要通知誰?只有買主把鐘表買回家,買主的家人注冊到這個鐘表,這時,鐘表的狀態改變才會通知到家里的人,那么家人有大人、小孩,他們看到或者聽到這個鐘表的時間改變,會有不同的行為。

    那么將上面的例子可以化解為對象。鐘表是個源,它是抽象的概念,可以很多形式的表,手表、掛鐘、鬧鐘等,而家人們都是監聽器,實現了監聽器接口,監聽器方法就是listen()和see(),當人每個人實現了接口會有不同的行為,這些鐘表并不關心,它只會在整點時通知之前注冊到它內部的家人實例的監聽器方法。

    那是什么時候注冊的呢?就是主人買回家,告訴家人這是新的鐘表,也就是Timer.registerListener(Listener l)

    那么鐘表就是observable,就是那個常說的Subject,而家人就是具體的Observer,實現了Oberver接口的方法。

    package com.javapatterns.observer;

    public abstract class AbstractTimer {
        
        
    public void attach(){};
        
        
    public void detach(){};
        
        
    void notifyObservers(){};
    }

     

    package com.javapatterns.observer;

    import java.util.Enumeration;
    import java.util.Vector;

    public class ConcreteTimer extends AbstractTimer {

        
    private Vector observersVector = new java.util.Vector();
        
        
    public void attach(Listener observer)
        
    {
            observersVector.addElement(observer);
        }

        
        
    public void detach(Listener observer)
        
    {
            observersVector.removeElement(observer);
        }


        
    public void notifyObservers()
        
    {
            Enumeration enumeration 
    = observers();
            
    while (enumeration.hasMoreElements())
            
    {
                Listener l 
    = (Listener)enumeration.nextElement();
                l.see();
                l.hear();
            }

        }



        
    public Enumeration observers()
        
    {
            
    return ((Vector) observersVector.clone()).elements();
        }

        
    }

    下面是Listner接口,是一個概念模型,提供給Timer,Timer只關心,自身改變狀態后,要調用的觀察者什么行為,并不關心觀察者本身。所以提取人的若干行為,抽象成為接口。

    package com.javapatterns.observer;

    public interface Listener {
        
        
    void see();
        
        
    void hear();

    }

     

    package com.javapatterns.observer;

    public class Host implements Listener {
        
        
    private String name;
        
        
    private short age;
        
        
    private String sex;
        
        
    public Host(String name,short age,String sex){
            
    this.name = name;
            
    this.age = age;
            
    this.sex = sex;        
        }


        
    public void see() {
            
    // TODO add see default behavior

        }


        
    public void hear() {
            
    // TODO add hear default behavior

        }

        
        
    public void otherBehavior(){
            
        }


        
    public short getAge() {
            
    return age;
        }


        
    public void setAge(short age) {
            
    this.age = age;
        }


        
    public String getName() {
            
    return name;
        }


        
    public String getSex() {
            
    return sex;
        }


    }


    這是一個主人的類,也就是一類具體的Observer。

    output.jpg


    接口java.util.Observer和類java.util.Observable是Java本身對于觀察者模式的支持。

    其實這種模式就是一種回調的應用,就是想其它類中注冊自己的接口,到特定時候調用自己的方法。

    就好像古詩詞中,“有朋自遠方來不亦樂乎”,意思是說,如果好友光臨到門口,叫一聲自己,就會很高興,也就是說,告訴朋友到達自己住處,這個狀態滿足,那么就叫一聲自己,自己就會為朋友開門,高興等行為就會進行。 如果不采用觀察者模式,那就是自己需要不斷的到門口察看朋友是否到了,是一種輪循的方式,當然也能達到效果,但會影響自己的事情。

    posted @ 2005-11-27 11:26 北國狼人的BloG 閱讀(443) | 評論 (0)編輯 收藏
    第一次使用Linux,在這上做Java開發.

    在Fedora Core 3的發行版中,附帶的是GNU版的JRE,下載的最新的 Eclipse SDK 3.1.1,解壓以后,根本不能正常啟動界面。

    由于我們一般能夠獲取的Linux發行版本都是免費的版本,而不是Professional或者Enterprise Server級別的,這些版本對Sun的JDK支持都很有限


    版本檢查

    我們這個時候可以打開一個命令行終端,輸入"java -version",可以看到如下信息:

    [ljl@localhost ~]$ java -version
    java version "1.4.2"
    gij (GNU libgcj) version 4.0.0 20050519 (Red Hat 4.0.0-8)

    Copyright (C) 2005 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    看到了吧?這并非Sun官方的Java。

    我們需要到Sun的網站上下載最新的JDK,目前的版本是JDK 5.0 Update 5,注意,這里有兩個版本:jdk-1_5_0_05-linux-i586-rpm.bin和jdk-1_5_0_05-linux- i586.bin,根據Fedora Core 3的Release Notes說明,應該使用后者,也就是不帶rpm的版本。(我用的是jdk-1_5_0_05-nb-4_1-linux-ml.bin,連NetBeans4.1都帶了,哈哈)

    同時,我們也需要到eclipse.org上下載最新的Eclipse SDK,目前版本3.1.1。需要根據你的系統環境選擇合適的下載包,如:我的電腦是x86的,X Window系統用的是GNOME 2.10.0,那么自然應該選「x86/GTK 2」,文件名eclipse-SDK-3.1.1-linux-gtk.tar.gz。需要說明一下,FC3默認的X Window系統是GNOME,但是在KDE環境下,照樣可以正常使用GTK的應用程序。


    安裝和配置

    我們現在打開一個命令行終端,輸入命令su,提供root用戶密碼,進入管理員操作模式。然后用ls -l看一下剛剛下載的jdk-1_5_0_05-linux-i586.bin,可以看到它的權限是-rw-r--r--,所有者為sean。為了能夠執 行它,需要更改它的權限設置。敲入命令chmod +x jdk-1_5_0_05-linux-i586.bin,再看權限,-rwxr-xr-x,可以執行了。

    切換到/opt/目錄,運行jdk-1_5_0_05-linux-i586.bin即可。注意:在Linux默認PATH不包含當前目錄,即".",因 此執行當前目錄的文件,正確的方法是在文件名前面加上"./"。成功以后可以發現在/opt/目錄下多了一個jdk1.5.0_05子目錄,這就是我們的 JAVA_HOME。

    到這里還沒完,在終端里檢查java -version找到的仍然是原來的GNU版本,我們還需要配置系統的環境變量PATH。檢查目前PATH內容的方式是echo $PATH,為了能夠直接找到我們自己的java,需要把/opt/jdk1.5.0_05/bin目錄加入PATH,并且要在GNU版本的前面,最保險 的辦法當然是放到最前面了。方法是PATH="/opt/jdk1.5.0_05/bin:$PATH"。這之后再敲java -version,出來的就是正確的了:

    [sean@localhost Java]$ java -version
    java version "1.5.0_05"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_05-b05)
    Java HotSpot(TM) Client VM (build 1.5.0_05-b05, mixed mode, sharing)

    為了今后登錄的時候就把這個路徑加到環境中,需要修改一下.bash_profile,先cd ~進入自己的主目錄,然后用emacs或者vi編輯這個文件,找到PATH這一行,改成:
    PATH=/opt/jdk1.5.0_05/bin:$PATH:$HOME/bin
    保存,退出,注銷然后重新登錄。

    接下來要做的就是把Eclipse解壓到一個你認為合適的路徑。


    開始使用

    有很多方式運行我們的Eclipse:命令行或文件瀏覽器直接打開都可以。我這里告訴大家一個在GNOME里面比較方便的一種途徑:從文件瀏覽器把eclipse運行文件拖放到系統的面板上,給它一個名字和圖標,今后就可以直接點這個面板圖標啟動Eclipse了。

    親切的Eclipse又出現了,Great!Let's JAVA!
    posted @ 2005-11-26 19:23 北國狼人的BloG 閱讀(497) | 評論 (0)編輯 收藏
    從我第一次認識達內,就是公開課,當然也是免費的.但質量很高,都是資深專家進行講座.這是達內認真做事的一種側面表現.

    在這里,有經驗的精英會和你分享經驗,這是無私的,他們原意告訴你IT業界的動態,幫您分析您所處位置,進入IT行業,或者提升職位,要做哪些努力.無論您是否參加達內培訓,都可以進行深入交流.

    有一點,大家也要注意,達內各個級別的員工都是每周六不休息的,咨詢專家,技術專家,人力資源資深專家,每周都有會提供給大家講座,提供交流的機會.這是 一種反應公司理念的態度.如果再次選擇,我仍然選擇達內,因為至少我在達內的每時每刻,我永遠不會感受到無助.我反倒是覺得現在怎么問題少了,沒問題請教 達內的精英,呵呵.

    就到這了,假如您在IT職場遇到困惑,可以考慮去聽一聽,會有收獲的.






    posted @ 2005-11-26 16:51 北國狼人的BloG 閱讀(848) | 評論 (1)編輯 收藏

    作為程序員,思維要縝密,對于技術人員,創造只是一小部分,大部分還是要腳踏實地。

    所以每個問題一定要想到各種情況,測試人員可能會用你想不到的數據進行測試。

    練習1:計算某數的階乘!

    package com.ljl;

    public class Factorial {
        
        
    public static void main(String[] args)
        
    {
            
    try{
                
    int num = Integer.parseInt(args[0]);
                
    if(num < 0)
                
    {
                    System.out.println(
    "please input positive number!");
                    System.exit(
    0);
                }

                
    if(num > 170)
                
    {
                    System.out.println(
    "this program can't calculate this num!");
                    System.exit(
    0);
                }

                
    double result = 1d;
                
    for(int i = 2; i <= num; i++)
                
    {
                    result 
    *= i;
                }

                System.out.println(
    "The factorial of " + num + " is " + result);
            }

            
    catch(Exception ex)
            
    {
                
    if(ex instanceof ArrayIndexOutOfBoundsException)
                
    {
                    System.out.println(
    "Please input the num to calculate!");
                    System.exit(
    0);
                }

                
    if(ex instanceof NumberFormatException)
                
    {
                    System.out.println(
    "Please input a number!");
                    System.exit(
    0);
                }

                System.out.println(
    "error occured!please run it again!");
                System.exit(
    0);
                
            }
            
        }

    }


    那么對于數據輸入的合法性判斷,對于數據是否合理,對于程序是否能夠計算所有的數,有無上界。

    記住,即使不能計算,也要告訴用戶,決不能給用戶提供錯誤的答案!!

    result 類型如果為int只能算到12,如果為long能算到20,如果為float只能算到32,如果為double,則可以算到170。

    為什么double和long同占用8個字節,為什么表示數的范圍差那么多?因為double類型支持科學計算法。

    The factorial of 170 is 7.257415615307994E306

    所以可能用指數方式來表達大數。

    那么如果表示170以后的數的階乘呢?可以猜用類,也可以找兩個變量,一個存底數,一個存指數。


    =================================

    數組

    int[] mark = new int[10];40字節存儲空間。

    -----------------------
    對于局部變量,需要初始個值。

    而局部變量的數組,不需要初值,會根據類型給定相應默認值。數值為0/0.0,布爾false,對象null,char /u0000

    ----------------------

    mark 是一個int[]數組類型的對象,它保存的是那40字節存儲空間的首地址。

    Java中,引用和地址都保存在棧中,而具體的值開辟的空間存儲在堆中。


    System.arraycopy(a,0,b,0,a.length);
    int[] a = {1,2,3,4,5}
    int[] b = new int[10];
    a.length

    數組特點
    1.不可變長
    2.可以保存簡單類型數據
    3.查找快,插入和刪除效率低。



    2維數組

    int[][] a = {{1,2},{3,4},{5,6}};
    int[][] a = new int[3][];
    a[0] = new int[2];
    a[1] = new int[3];
    a[2] = new int[1];

    a類型?是一個對象,但是是虛擬機級別對象,無法用getClass().getName()顯示。

    哥德巴赫猜想

    package com.ljl;

    public class Goldbach {
        
        
    public static void main(String[] args)
        
    {
            
    int num = Integer.parseInt(args[0]);
            
    if(num < 6)
            
    {
                System.out.println(
    "the num must larger than six!");
                System.exit(
    0);
            }

            
    if(num%2 != 0)
            
    {
                System.out.println(
    "it should be a even!");
                System.exit(
    0);
            }

            
    for(int i = 1; i <= num/2; i++)
            
    {
                
    if(isZhiShu(i)&&isZhiShu(num-i)){
                    System.out.println(num 
    + "=" + i + "+" + (num-i));
                    
    break;
                }

            }

            
        }

        
        
    private static boolean isZhiShu(int num)
        
    {
            
    for(int i = 2; i <= (int)Math.sqrt(num); i++)
            
    {
                
    if(num%== 0)
                    
    return false;
            }

            
    return true;
        }

    }

    posted @ 2005-11-25 23:35 北國狼人的BloG 閱讀(306) | 評論 (0)編輯 收藏
    變量

    1.對局部變量,要先賦值,后使用。
    2.一個局部變量,作用域,是定義它的代碼塊

    public class Test{
       public static void main(String[] args){
            {
                int a = 4;
             }
             System.out.println(a);          
       }   
    }

    a的作用域在main里面的兩個括號之間。所以,此程序編譯不通過。cannot resolve symbol

    3.對于兩個局部變量,在同一作用域內不允許兩個同名變量出現。

    public class Test{
       public static void main(String[] args){
          int a = 6;
          {
             int a = 4;
          }
          System.out.println(a);
       }

    }

    在小代碼塊,重了。Duplicate local variable a。

    ------------------------------

    命名規范

    1.語義
    2.包,所有字母小寫
    3.類,所有單詞首字母大寫
    4.變量、方法,首字母小寫,其余單詞首字母大寫
    5.常量,所有字母大寫


    byte b=1;
    b=b+1;報錯,因為b+1運算后,系統轉為int,無法隱式轉換
    b+=1;不報錯。請查看JVM,字節碼差異。



    >>   右移  除2,左補符號位
    <<   左移  乘2,右補0
    >>>  右移,左永遠補0

    雖然比乘除運算符快,但是有問題。

    12>>32

    回變為12。

    12&9    按位與
    12|9    或
    12^9   異或

    (a>b)&(c>d)
    非短路方式,都判斷,并不會因為a>b為假而不進行后面表達式的判斷。

    (a>b)&&(c>d)
    短路方式,a>b為假,后面不執行,直接返回false。

    int i = 3;
    int count = (i++)+(i++)+(i++);
    count = 3 + 4 + 5
                i=4  i=5  i=6

    int i =3;
    i = i++;
    那么流程如下

    i++這個表達式的值是3。然后執行i自加1,變為4(因為++操作比賦值優先級高),最后i 再次被賦值為3。



    不記運算符優先級,最好用括號老解決,很明白,否則像這樣的b+++a表達式,實際上(b++)+a。
    posted @ 2005-11-24 23:26 北國狼人的BloG 閱讀(386) | 評論 (0)編輯 收藏
    僅列出標題
    共17頁: First 上一頁 9 10 11 12 13 14 15 16 17 下一頁 
    主站蜘蛛池模板: 免费国产成人高清在线观看麻豆| 免费看一级一级人妻片| 免费人成黄页在线观看日本| 五月婷婷亚洲综合| 国产一区二区免费| 亚洲AV永久无码区成人网站| 久久er国产精品免费观看8| 99精品一区二区免费视频| 亚洲午夜久久久久久久久久| 99精品视频在线观看免费| 亚洲AV无码乱码国产麻豆| 精品熟女少妇av免费久久| 亚洲精品视频观看| 欧美大尺寸SUV免费| 麻豆亚洲AV成人无码久久精品| 又大又黄又粗又爽的免费视频| 一级毛片大全免费播放| 亚洲无线码在线一区观看| 无码人妻AV免费一区二区三区| 久久久久亚洲Av无码专| 免费a级毛片高清视频不卡| 国产精品日本亚洲777| 亚洲人成图片小说网站| 最近2019中文字幕免费直播| 亚洲日韩亚洲另类激情文学| 免费乱码中文字幕网站| 免费观看久久精彩视频| 国产亚洲国产bv网站在线| 亚洲JIZZJIZZ中国少妇中文| 好久久免费视频高清| 亚洲成A人片在线播放器| 亚洲Av无码乱码在线观看性色 | 亚洲一区二区三区无码中文字幕| 免费无码又爽又刺激网站直播| 日本免费电影一区| 中文字幕无线码中文字幕免费| 亚洲综合激情九月婷婷| 日本免费一区二区三区最新| 国产一区二区三区免费观看在线| 亚洲av片不卡无码久久| 国产av无码专区亚洲av果冻传媒|