性格決定命運(yùn),氣度影響格局
          posts - 20, comments - 18, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          我的Java學(xué)習(xí)筆記

          Posted on 2007-07-28 17:42 尚愛軍 閱讀(585) 評論(2)  編輯  收藏


          1.Java基礎(chǔ)概念


          Path:windows系統(tǒng)那個(gè)執(zhí)行命令時(shí)要搜尋的路徑。
          classpath:java在編譯和運(yùn)行時(shí)要找的class所在的路徑。
          一個(gè)源文件中最多只能有一個(gè)public類,其他類的個(gè)數(shù)不限。
          //用于單行注釋
          /*     */用于多行注釋
          /**    */用于多行注釋,且可以被doc工具解析


          java標(biāo)識(shí)符命名規(guī)則
                1.標(biāo)識(shí)符由字母、下劃線"_"、美元符"$"或數(shù)字組成。    
                2.標(biāo)識(shí)符應(yīng)該以字母、下劃線、美元符開頭。
                3.Java標(biāo)識(shí)符大小寫敏感,長度無限制。

          Java內(nèi)存管理分為四個(gè)區(qū)域:heap、stack、code segment、data segment
              stack :局部變量

              heap: 所有 new 出來的東西

              code segment:存放代碼

              data segment:靜態(tài)變量,字符串常量
              注意:類是靜態(tài)的概念,存在于code segment中;對象是動(dòng)態(tài)的概念,因?yàn)闀r(shí)new出來的,所以位于heap中。

          面向?qū)ο蟮脑O(shè)計(jì)思想是:從現(xiàn)實(shí)世界中客觀存在的事物出發(fā)來構(gòu)造軟件系統(tǒng),并且系統(tǒng)的構(gòu)造中盡可能運(yùn)用人類的自然思維方式。

          方法的重載(overload)
              一個(gè)類可以有相同的名字,但參數(shù)不同的多個(gè)方法。調(diào)用時(shí),會(huì)根據(jù)不同的參數(shù)來選擇對應(yīng)的方法。
              構(gòu)造方法也可以重載。


          this關(guān)鍵字的說明
              1.在類的方法定義中使用的this關(guān)鍵字代表使用該方法的對象的引用。
              2.當(dāng)必須指出當(dāng)前使用方法的對象是誰的時(shí)候要是用this。
              3.有時(shí)使用this可以處理的方法中成員變量和參數(shù)重名的情況
              4.this可以看作是一個(gè)變量,它的值是當(dāng)前對象的引用。


          static關(guān)鍵字的說明
              1.在類中,使用static聲明的成員變量為靜態(tài)成員變量,它為該類的公用變量,在第一次使用那個(gè)是被初始化,對于該類的所有對象來說,static成員變量只有一份。
              2.用static聲明的方法為靜態(tài)方法,在調(diào)用該方法時(shí),不會(huì)將對象的引用傳遞給它,所以在static方法中不可訪問非static的成員。靜態(tài)方法不再是針對某個(gè)對象調(diào)用,所以不能訪問非靜態(tài)成員。
              3.可以通過對象引用或類名(不需要實(shí)例化)訪問靜態(tài)成員。
             

          J2SDK中主要的包介紹
              1.java.lang----包含一些java的核心類,如String、Math、Integer、System和Thread,提供常用的功能。
              2.java.awt----包含了構(gòu)成抽象窗口工具集(abstract window toolkits)的多個(gè)類,這些類被用來構(gòu)建和管理應(yīng)用程序的圖形用戶界面(GUI)
              3.java.applet----包含applet運(yùn)行所需的一些類。
              4.java.net----包含執(zhí)行與網(wǎng)絡(luò)有關(guān)的操作的類。
              5.java.io----包含能提供多種輸入/輸出功能的類。
              6.java.util----包含一些使用工具類,如定義系統(tǒng)特性、使用與日期日歷相關(guān)的函數(shù)。

          打jar包命令:jar -cvf xxxx.jar *.*


          訪問控制
              1.Java權(quán)限修飾符 public、protected、private置于類的成員定義前,用來限定其他對象對該類對象成員的訪問權(quán)限。

              2.對于class的權(quán)限修飾只可以用public和default.
              3.public 類可以在任何地方被訪問。
              4.default類之可以被統(tǒng)一個(gè)包內(nèi)部的類訪問。


          方法的重寫(overwrite/override)
              1.在子類中可以根據(jù)需要對從基類中繼承來的方法進(jìn)行重寫。
              2.重寫方法必須和被重寫的方法具有相同的名稱、參數(shù)列表和返回類型。
              3.重寫方法不能使用比被重寫的方法更嚴(yán)格的訪問權(quán)限。


          承中的構(gòu)造方法
              1.子類的構(gòu)造的過程中必須調(diào)用其基類的構(gòu)造方法。
              2.子類可以在自己的構(gòu)造方法中使用super(argument_list)調(diào)用基類的構(gòu)造方法。
                   (1)使用this(argument_list)調(diào)用本類的另外的構(gòu)造方法。
                   (2)如果調(diào)用super,必須寫在子類構(gòu)造方法的第一行。
              3.如果子類的構(gòu)造方法中沒有顯示地調(diào)用基類的構(gòu)造方法,則系統(tǒng)默認(rèn)調(diào)用基類無參的構(gòu)造方法。
              4.如果子類構(gòu)造方法中既沒有顯示調(diào)用基類構(gòu)造方法,而基類中有沒有無參的構(gòu)造方法,則編譯出錯(cuò)。


          Object類的說明
              Object類是所有Java類的根基類。如果在類的聲明中未使用extends關(guān)鍵字指明其基類,則默認(rèn)基類為 Object類。


          toString方法
              1.Object類中定義有public String toString()方法,其返回值是String類型,描述當(dāng)前對象的有關(guān)信息。
              2.在進(jìn)行String與其它類型數(shù)據(jù)的連接操作時(shí),(如:System.out.println("info" +people)),將自動(dòng)調(diào)用該對象的toString()方法。
              3.可以根據(jù)需要在用戶自定義類型中重寫toString()方法。


          equals方法
              1.Object類中定義有:public boolean equals(Object obj)方法
              2.Object的equals方法定義為:x.euqals(y),當(dāng)x和y是統(tǒng)一個(gè)對象的應(yīng)用的時(shí)候返回ture,否則反回false。
              3.J2SDK提供的一些類,如String、Date等,重寫了Object的equals方法,調(diào)用這些內(nèi)容的equals方法,x.equals(y),當(dāng)x和y所引用的對象是同一類對象且屬性內(nèi)容相等時(shí)(并不一定是相同的對象),返回true,否則返回false。
              4.可以根據(jù)需要在用戶自定義的類型中重寫equals方法。


          對象轉(zhuǎn)型(casting)
              1.一個(gè)基類的引用類型可以"指向"其子類的對象。
              2.一個(gè)基類的引用不可以訪問其子類對象新增加的成員(屬性和方法)。
              3.可以使用引用   變量 instanceof 類名 來判斷該引用變量所 "指向"的對象是否屬于該類或該類的子類。
              4.子類的對象可以當(dāng)作基類的對象來使用 稱為向上轉(zhuǎn)型 (upcasting),反之稱為向下轉(zhuǎn)型(downcasting)


          多態(tài)
              1.要有繼承
              2.要有重寫
              3.父類引用指向子類對象。


          抽象類
              1.用abstract關(guān)鍵字來修飾一個(gè)類時(shí),這個(gè)類叫抽象類;用abstract來修飾一個(gè)方法時(shí),該方法叫做抽象方法。
              2.含有抽象方法的類必須被聲明為抽象類,抽象類必須被繼承,抽象方法必須被重寫。
              3.抽象類不能被實(shí)例化。
              4.抽象方法只需聲明,而不需實(shí)現(xiàn)。
          abstract class Person {
             private String name;
             Person(String name) {
                this.name = name;
             }
              public abstract void study();  //抽象方法只能被聲明
          }


          final關(guān)鍵字(相當(dāng)于C++中的const)
              1.final的變量的值不能被改寫。
              2.final的方法不能被重寫
              3.final的類不能被繼承。


          接口
              1.接口是抽象方法和常量值的定義的集合。
              2.從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有變量和方法的實(shí)現(xiàn)。
              3.接口的特性
                    1.多個(gè)無關(guān)的類可以實(shí)現(xiàn)同一個(gè)接口。
                    2.一個(gè)類可以實(shí)現(xiàn)多個(gè)無關(guān)的接口。
                    3.與繼承關(guān)系類似,接口與實(shí)現(xiàn)類之間存在多態(tài)性。
                    4.接口中聲明 屬性 默認(rèn)為public static final的,也只能是public static final的
                    5.接口只能定義 抽象方法,而且這些 方法 默認(rèn)為public的,也只能是public的
                    6.接口可以繼承其他的借口,并添加新的屬性和抽象方法。


          2.關(guān)于包與File的一點(diǎn)注意

          就是說生成了一個(gè)File類對象,而這個(gè)程序使用了包 com.xxx.www,那么這個(gè)文件的真實(shí)根路徑就是最外層

          包c(diǎn)om所在的路徑。也就是說這個(gè)程序編譯后要想運(yùn)行,使用如下命令java  com.xxx.www.程序名稱(也就

          是:java 包名.程序名稱),但是生成的file卻在com所在的父路徑下。

          3.容器綜述



          Set 中的數(shù)據(jù)對象沒有順序且不可以重復(fù)。

          List 中的數(shù)據(jù)對象有順序且可以重復(fù)。

          Map 接口定義了存儲(chǔ)"鍵(key)-值(value)"映射對的方法。

          Collection、Set、List、Map為接口。
          注意:所謂的重復(fù)是指兩個(gè)對象equals();需要進(jìn)入java.util.*包

          Collection舉例
          ********************************************************************************************
          1.容器類對象在調(diào)用remove、contains等方法時(shí)需要比較對象是否相等,這會(huì)涉及到對象類型的equals方法 *
          和hashCode方法;對于自定義的類型,需要重寫equals和hashCode方法以實(shí)現(xiàn)自定義的對象相等規(guī)則。      *
          2.相等的對象應(yīng)該具有相等的hash codes 。                                                                                                             *
          ********************************************************************************************
          import java.util.*;

          public class BasicContainer {
              public static void main(String[] args) {
                  Collection c = new HashSet();
                  c.add("hello");
                  c.add(new Name("f1","l1"));
                  c.add(new Integer(100));      //String類重寫了equals()方法,所以會(huì)去除100
                  c.remove("hello");                  //String類重寫了equals()方法,所以會(huì)去除"hello"
                  c.remove(new Integer(100));
                  System.out.println
                            (c.remove(new Name("f1","l1")));  //自己定義的類,要想返回true,必須重寫equals()方法。
                  System.out.println(c);
              }


          }

          class Name {
              private String firstName,lastName;
              public Name(String firstName, String lastName) {
                  this.firstName = firstName; this.lastName = lastName;
              }
              public String getFirstName() {  return firstName;   }
              public String getLastName() {   return lastName;   }
              public String toString() {  return firstName + " " + lastName;  }
             
              public boolean equals(Object obj) {
               if (obj instanceof Name) {
                   Name name = (Name) obj;
                   return (firstName.equals(name.firstName))
                       && (lastName.equals(name.lastName));
               }
               return super.equals(obj);                     //如果自己處理不了,就交給父類Object去處理。
            }
            public int hashCode() {
                return firstName.hashCode();            //交給了String的hashCode()方法去處理
            }
              
            
           }


          Iterator接口   
              1.所有實(shí)現(xiàn)了Collection接口的容器類都有一個(gè)iterator方法用以返回一個(gè)實(shí)現(xiàn)了Iterator接口的對象。
              2.Iterator對象稱為迭代器,用于方便的實(shí)現(xiàn)對容器內(nèi)元素的遍歷操作。
              3.Iterator接口定義了如下方法:boolean hasNext()    //判斷游標(biāo)右邊是否有元素
                                                                        Object next()            //返回游標(biāo)右邊的元素并將游標(biāo)移動(dòng)到下一個(gè)位置
                                                                        void remove()          //刪除游標(biāo)左邊的元素,在執(zhí)行完next之后該操作只
                                                                                                               能執(zhí)行一次。
          舉例1:
               Collection c = new HashSet();
               c.add(new Name("f2","12"));
               c.add(new Name("fff3","1113"));
               for(Iterator i = c.iterator(); i.hasNext(); ) {
                   Name name = (name) i.next();
                   if(name.getFirstName().length() < 3) {
                      i.remove();
                   }
               }
              System.out.println(c);

          說明:這個(gè)程序里,雖然Collection也有remove方法,但是不能c.remove(name),這樣會(huì)出錯(cuò)。
                      因?yàn)閳?zhí)行這個(gè)程序是,iterator執(zhí)行了鎖定。

          增強(qiáng)的For循環(huán)    (J2SDK 1.5以后增加的)
          import java.util.*;

          public class EnhancedFor {
           public static void main(String[] args) {
            int[] arr = {1, 2, 3, 4, 5};
            for(int i : arr) {                            //將arr中的元素依次拷貝到i中,然后打印i。
             System.out.println(i);
            }
            
            Collection c = new ArrayList();
            c.add(new String("aaa"));
            c.add(new String("bbb"));
            c.add(new String("ccc"));
            for(Object o : c) {
             System.out.println(o);            //將c中的元素依次拷貝到o中,然后依次打印o。
            }                                                  //這里的println是調(diào)用了o的toString方法,因?yàn)镾tring類重寫了toString方法
           }                                                   //了,所以這里就調(diào)用了String類的toString方法,這里面存在多態(tài)。
          }
          優(yōu)點(diǎn):對于遍歷Array或Collection的時(shí)候相當(dāng)方便。
          缺點(diǎn):遍歷數(shù)組的時(shí)候不能訪問下標(biāo)。
                      與使用iterator相比,不能方便的刪除集合中的內(nèi)容。在內(nèi)部也是調(diào)用iterator。
          總結(jié):除了簡單遍歷并讀出其中的內(nèi)容外,不建議使用增強(qiáng)的for。


          List常用算法
               類java.util.Collections提供了一些靜態(tài)方法實(shí)現(xiàn)了基于List容器的一些常用算法。
              1.static void sort(List)      對List容器內(nèi)的關(guān)系排序。
              2.static void shuffle(List)  對List容器內(nèi)的對象進(jìn)行隨機(jī)排序。
              3.static void reverse(List) 對List 容器內(nèi)的對象進(jìn)行逆序排列。
              4.static void fill(List, Object) 用一個(gè)特定的對象重寫整個(gè)List容器。
              5.static void copy(List dest, List src) 將src List容器內(nèi)的內(nèi)容拷貝到dest List容器內(nèi)。
              6.static int binarySearch(List
          , Object) 對于順序的List容器,采用折半查找的方法找特定的對象。


          Comparable接口
              1.問題:上面的算法根據(jù)什么確定容器中的對象的"大小"順序?
              2.所以可以"排序"的類都實(shí)現(xiàn)了java.lang.Comparable接口,Comparable接口中只有一個(gè)方法
                      public int compareTo(object obj)   
                 該方法的返回值為:0  表示this==obj
                                                 正數(shù)表示this > obj
                                                 負(fù)數(shù)表示this < obj
              4.實(shí)現(xiàn)了Comparable接口的類通過實(shí)現(xiàn)compareTo方法從而確定了該類的排序方式。
          例子:
          import java.util.*;

          public class BasicContainer {
              public static void main(String[] args) {
                  Collection c = new HashSet();
                  c.add("hello");
                  c.add(new Name("f1","l1"));
                  c.add(new Integer(100));
                  c.remove("hello");
                  c.remove(new Integer(100));
                  System.out.println
                            (c.remove(new Name("f1","l1")));
                  System.out.println(c);

          //下面的一段代碼是應(yīng)用comparable的例子
                  List l = new LinkedList();
                  l.add(new Name("Karl","L"));
                  l.add(new Name("Steven","Lee"));
                  l.add(new Name("Tom","Wang"));

                  System.out.println(l);
                  Collections.sort(l);   //調(diào)用了Name的compareTo方法
                  System.out.println(l);
              }


          }

          class Name implements Comparable {
              private String firstName,lastName;
              public Name(String firstName, String lastName) {
                  this.firstName = firstName; this.lastName = lastName;
              }
              public String getFirstName() {  return firstName;   }
              public String getLastName() {   return lastName;   }
              public String toString() {  return firstName + " " + lastName;  }
             
              public boolean equals(Object obj) {
               if (obj instanceof Name) {
                   Name name = (Name) obj;
                   return (firstName.equals(name.firstName))
                       && (lastName.equals(name.lastName));
               }
               return super.equals(obj);
            }
            public int hashCode() {
                return firstName.hashCode();
            }
            
            
            
            public int compareTo(Object o) {
                  Name n = (Name)o;
                  int lastCmp =
                      lastName.compareTo(n.lastName);  //調(diào)用了String類的compareTo方法,因?yàn)镾tring類重寫了該方法
                  return
                       (lastCmp!=0 ? lastCmp :
                        firstName.compareTo(n.firstName));
              }
            
          }

              Array    讀快改慢
              Linkded改快讀慢
              Hash      兩者之間


          Map接口
              1.實(shí)現(xiàn)Map接口的類用來存儲(chǔ)鍵-值對
              2.Map接口的實(shí)現(xiàn)類有HashMap和TreeMap等。
              3.Map類中存儲(chǔ)的鍵-值對通過鍵來標(biāo)識(shí),所以鍵值不能重復(fù)(必須重寫equals方法和hashCode方法,才能保證不能重復(fù))



          自動(dòng)打包/自動(dòng)解包
          看下面的例子

          import java.util.*;
          public class TestMap {
            public static void main(String args[]) {
              Map m1 = new HashMap();
              Map m2 = new TreeMap();
              //m1.put("one",new Integer(1));
              m1.put("one", 1);                            //自動(dòng)將int 大包成 Integer類型
              //m1.put("two",new Integer(2));
              m1.put("two", 2);
              //m1.put("three",new Integer(3));
              m1.put("three", 3);
              //m2.put("A",new Integer(1));
              m2.put("A", 1);
              //m2.put("B",new Integer(2));
              m2.put("B", 2);
              System.out.println(m1.size());
              System.out.println(m1.containsKey("one"));
              System.out.println
                  //(m2.containsValue(new Integer(1)));
                  (m2.containsValue(1));
              if(m1.containsKey("two")) {
                //int i = ((Integer)m1.get("two")).intValue();
                int i = (Integer)m1.get("two");                             //自動(dòng)將Integer 解包成 int類型
                System.out.println(i);
              }
              Map m3 = new HashMap(m1);
              m3.putAll(m2);
              System.out.println(m3);
            }
          }

          例子2
          import java.util.*;          //沒有自動(dòng)打包/解包
          public class TestArgsWords {
            //private static final Integer ONE = new Integer(1);
            private static final int ONE = 1;
            public static void main(String args[]) {
              Map m = new HashMap();
              for (int i = 0; i < args.length; i++) {
               Integer freq = (Integer) m.get(args[i]);
                
                m.put(args[i],(freq == null? ONE : new Integer(freq.intValue() + 1)));
               }
              System.out.println
                  (m.size() + " distinct words detected:");
              System.out.println(m);
            }
          }


          import java.util.*;                           //修改后的程序,使用了自動(dòng)打包/解包
          public class TestArgsWords {
            //private static final Integer ONE = new Integer(1);
            private static final int ONE = 1;
            public static void main(String args[]) {
              Map m = new HashMap();
              for (int i = 0; i < args.length; i++) {

                int freq = (Integer) m.get(args[i]) == null ? 0 : (Integer) m.get(args[i]);
                m.put(args[i], freq==0 ? ONE : freq + 1);
              }
              System.out.println
                  (m.size() + " distinct words detected:");
              System.out.println(m);
            }
          }









          每天都有新的變化,請關(guān)注我的Blog


          評論

          # re: 我的Java學(xué)習(xí)筆記  回復(fù)  更多評論   

          2007-08-10 19:10 by 卡天其
          哈哈,聽基礎(chǔ)的,適合初學(xué)者借鑒

          # re: 我的Java學(xué)習(xí)筆記  回復(fù)  更多評論   

          2007-10-30 16:47 by 尚小豬豬
          是啊,大家都來學(xué)學(xué)吧,很好的東西啊

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 夏邑县| 宝应县| 海盐县| 古交市| 惠水县| 贡嘎县| 镇远县| 岐山县| 双牌县| 城步| 天柱县| 溆浦县| 辽中县| 涞水县| 临夏市| 浦北县| 卓资县| 揭阳市| 遵化市| 昌吉市| 新建县| 惠来县| 阿克苏市| 历史| 东明县| 搜索| 利川市| 金川县| 南投市| 彩票| 安庆市| 来凤县| 铜鼓县| 吉安县| 漳州市| 建湖县| 阿尔山市| 溧水县| 麦盖提县| 兴海县| 公安县|