java2學習筆記

java2學習筆記

設置環境變量
  在環境變量中的PATH中設置%JAVA_HOME%/BIN;
 
JDK開發環境工具
  工具主要存放在/bin下,共13個工具,26個EXE文件。

  JAVA編譯器JAVAC.EXE:將.JAVA文件轉換成字節碼.CLASS文件。對源程序中的每個類定義都會生成一個單獨的類文件。
  格式:javac[options] File.java ,其中:option可有
           1、-classpath<path> 指定javac的搜索類的路徑序列如:c:/>javac -classpath c:/my/lib;c:/home  welcome.java
           2、-d  指定編譯器生成的類文件存放目錄的根目錄  如:c:/>javac -d c:/classes welcome.java
           3、-g  編譯器產生調試表,包括對應的源代碼行號及變量信息。 如:c:/>javac -g welcome.java
           4、-verbose  編譯的同時輸出一些相關信息,包括:代碼名稱、類名、用時等。 如:c:/>javac -verbose welcome.java
 
  JAVA解釋器java.exe:直接執行java程序
  格式:java[options]classname[arguments],其中arguments是參數,options可有:
        1、-classpath 2、-D<name>=value:允許用戶在運行時改變屬性值。 3、-verify 使用校驗 4、-help 打印幫助。
       
  JAVA調試器jdb.exe
 
  C頭文件及存根文件生成器JAVAH.exe:可以從類文件生成C語言的頭文件和C源代碼文件,能跟C交互。
  格式:javah [options]classname,其中otions可有:
       1、-o 輸出文件名outputfile,將生成文件合成到outputfile文件中。
       2、-stubs 指令javah從java字節碼文件生成C源文件。
      
  反編譯器javap.exe,格式:javap [options]classname,其中otions可有:
       1、-l 顯示行號和局部變量表 如:javap -l welcome
       2、-b 保持向後兼容。
       3、-J flag 直接將flag的內容送到運行系統。
       4、-s 顯示內部類型標識。
       5、-verbose 顯示棧的大小,方法參數和局部變量等信息。
      
  APPLET瀏覽器APPLETVIEWER.EXE:運行java小應用程序。格式:appletviewer [options]htmlfilename。
 
  API文檔生成器javadoc.exe:可根據java源程序生成API文檔。
  格式:javadoc [options][packagelsource.java]*,文檔註釋以/**開頭 ×/結束,文檔性標籤:@
 
  壓縮工具jar.exe:格式:jar[options][manifest] destination inputfile [inputfiles],
    其中:manifest file聲明文件,destination jar file 目標文件  imput-file 要壓縮的文件
   用法:jar{ctxu}[vfm0Mi][jar-文件][manifest-文件][-C目錄]文件名。。。
     其中:-c 創建新文檔  -t 列出存檔列表  -x 展開所有文件  -u 更新文檔 -v 生成詳細輸出到標準輸出上
           -f 指定文件名 -m 包含標明信息 -o 只存儲方式,未壓縮 -M 不產生清單(manifest)文件 -i 產生索引 -C改變到指定目錄。
    如: jar cvf classes.jar Foo.class Bar.class 將兩個文件存到classes.jar中
         jar cvfm classes.jar mymanifest -C foo/ 將foo/下的所有文件存到classes.jar中
        
   代碼轉換器native2ascii.exe:將本地編碼轉換爲unicode字符。格式:native2ascii [options][inputfile[outputfile]]
  
   檢查器extcheck.exe:用來檢測jar包中是否有衝突。格式:extcheck[-verbose]<jar file>
  
   遠程對象編譯器rmic.exe:生成客戶端和服務器端。格式:rmic<options><class names>
  
   遠程對象激活器rmid.exe:啓用激活系統守護進程。格式:rmid<options>[-dir]
   
   遠程對象註冊器rmiregistry.exe:啓用註冊服務。格式:rmiregistry<options><port>
  
   jarsigner:爲java歸檔文件jar產生簽名。格式:jarsigner[options] jar-file alias
  
   keytool:密鑰和證書管理。keytool[options]
  
   程序Welcome:用javac、java
     public class Welcome
     {
       public static void main(String arg[])
       {
         System.out.println("Welcome to java!");
       }
     }
   小應用程序WelcomeApplet.java:
   import java.applet.*;
import java.awt.*;
public class WelcomeApplet extends Applet
{
   public void paint(Graphics g)
   {
     g.drawString("welcome to java!",10,50);
   }
}
和Applet.html
<html>
<title>WelcomeApplet</title>
<body>
<Applet code="WelcomeApplet" width=200 height=300>
</Applet>
</body>
</html>
然後用Appletviewer Applet.html來運行。

 

------------------------------------------------------------------
java類和對象
   方法的重載:就是在一個類中定義有多個名稱相同的成員方法,每個方法參數、返回值都可不同,調用時JVM自動根據調用形式在定義中匹配合適的成員方法。
   構造方法:特殊的方法,是對象被創建時初始對象的成員方法,具有和所在類名完全一樣的名字,定義後會自動調用,沒有返回值,返回值的類型就是類本身。構造方法也可以重載。
     如果構造方法省略,java會自動調用默認的構造方法(default constructor) 格式如下:public classname(){},默認的沒有任何參數,不執行任何操作。
   類的實例化:將類實例化就生成對象,在java中用new對類實例化,格式:type objectName=new type([paramlist]),其中:type:對象的類型名,objectName:對象名稱,new:爲對象分配內存空間,實例化一個對象,paramlist:參數表。
   this變量:可以在任何方法中引用當前對象。
   java的類庫在:JDK下的jre/lib下的rt.jar文件。
   類成員修飾符:private:只可以在同一類中,private protected:可以在同一類中和該類的子類中;protected:可以在同一類中和該類的子類及同一包中,public:甚至在其他包中都可以。
     程序位於兩個包,要用import包括進來。
     static修飾的變量或方法不需要實例化,格式:類名.變量名/方法名。
     static修飾的變量稱爲類變量,被所有對象共享,只有一個備份。
     static修飾的方法是類方法,它不能訪問實例變量,也不能用this。
     final修飾符用於定義類、成員變量、成員方法的非繼承性。修飾變量則說明該變量是常量,可以訪問不能修改。如:private final int INCREMENT=5

   兩個特殊的方法:構造方法和main方法。
     構造方法是對從這個類新創建的對象分配內存空間和初始化。構造方法的名字是init,由編譯器隱含提供,不允許程序員使用。不帶入口參數的構造方法是默認的構造方法。
     構造方法的調用規則:1、創建對象時,可以調用此類的父類的構造方法。2、如果一個類的構造方法中第一個語句沒有用super來調用其父類的構造方法,這編譯器也會默認用super()調用父類的不帶參數的構造方法,如果父類沒有不帶參數的構造方法,編譯就會出錯。3、如果某構造方法的第一句用this調用本類中的另一個構造方法,那麼java就不會默認這個構造方法調用父類的構造方法。4、一個構造方法用this調用本類中的另一個構造方法,而被調用的構造方法又是調用父類的構造方法而又沒有super語句,那麼java會默認他含有super語句,此時,如果父類沒有不帶參數的構造方法,編譯時就會出錯。
     main方法:在java的每個應用程序(Application)中,必須有main方法,java解釋器運行時首先尋找main方法,然後以此爲程序的入口點運行。而applet中由於沒有main方法,所以只能用帶java功能的瀏覽器和Appletview來運行。在java中,一般只有一個main,如果有多個main,只有第一個爲入口點。
   內部類:就是在某個類的內部嵌套定義一個類。有如下特性:1、可以聲明爲private或prtected.2、可定義爲abstract。3、不能與包含他的類名相同。4、可以使用包含他的類的變量,也可使用內部類所在方法的局部變量。5、內部類如果被聲明爲static,就變成了頂層類,就不能再使用局部變量。

   對象的創建、使用和清除:
     創建和使用:java用new創建對象。格式:type objectName=new type([paramlist]);訪問形式爲:objectName.member,objectName.memberFunction()
     對象的克隆:從現存的對象複製出完全一樣的副本,用clone實現,從Object類繼承下來。注意:首先檢查該對象是否能被克隆,如果對象實現了Cloneable接口,就可以被克隆,否則就會拋出一個異常CloneNotSupportException。Object本身沒有實現Cloneable接口,因此他的子類必須實現該接口才能被克隆。克隆出來的對象是同一種類型。
     用finalize清除對象:java運行時系統通過垃圾收集週期性的無用對象使用的內存完成對象的清除。用finalize()(包含在java.lang.Object)撤銷無用對象.finalize方法只能在java垃圾收集前調用。當一個對象超過作用域時,就不能調用finalize方法。應自行設計對象的釋放程序,以保證釋放的可靠性。
    
   對象的比較:1、用==,表示兩個引用是否指向同一對象。2、用equals。兩個字符串只要內容一樣,則==和equals返回true,但用String類的構造方法創建的兩個字符串s1和s2==返回的是false。對於同一類對象==和equals返回都是false,這是因爲同一類的不同個體是不同的。而使用obj1=obj2後,比較返回true,此時,兩個引用指向同一對象。
  
   類的繼承和多態性。繼承實現代碼複用,所有類都是通過Object類繼承來。多態性是指用相同的名字定義一系列方法,參數和返回值不同。
     繼承:用extends說明,格式:[ClassModifier]class ClassName [extends SuperClass][implemen interface]{}
     方法覆蓋:當子類的成員變量與父類的變量同名時,父類隱藏,當子類的方法與父類的方法同名,參數列表、返回值類型相同時,父類方法隱藏。繼承規則:1、子類繼承父類中公共類和保護類的成員變量。2、如果父類定義了沒有訪問約束的變量、方法,子類可以訪問。3、子類不能繼承父類中被聲明爲私有的變量。
     super:實現父類成員的訪問,包括子類隱藏了父類的變量、方法。
     抽象類和抽象方法:將常規操作抽象爲繼承結構中的較高級別。java中,用abstract修飾不能在類內實現的方法,稱爲抽象方法,含有抽象方法的類必須聲明爲abstract,叫抽象類(不一定包含抽象類,只能用於派生子類)。
     抽象方法:abstract returnType methodName(parameter1[,parameter2,parameter3...])
     抽象類:abstract class className extends parent implements interface1[interface2,interface3...]
     多態性
     java的垃圾回收:是java提供的自動內存回收功能
    
   接口、包
     接口:是方法定義和常量值的集合,是特殊的抽象類,用interface指明一個類必須作什麼,但不明確怎麼作,沒有變量和方法的實現。在類的構造過程中可以實現多個接口。在類對接口的實現中,必須實現接口中所有方法。利用實現多種接口,可以實現多繼承功能。
     定義:[public]interface interfaceName[extends superInterface]{}。如果定義爲public,則任何類均能訪問該接口。默認的只有相同包中類可以訪問該接口定義。其中extends表示有父接口,可以有多個父接口。
     接口體包括常量定義,具有public、final、static屬性。接口對方法只聲明,沒有方法體。方法只有public和abstract屬性。
     接口的實現:[ClassModifier]class ClassName[extends SuperClassName][implement interface]{},其中implement interface爲需要實現的接口,不同的接口用逗號分開。
     類必須實現接口中的所有方法。實現是相對的,既可以爲接口中的方法提供實現代碼,也可以不提供代碼(必須將方法的框架完整寫出)。接口也可繼承,用extends。如果一個類實現的是一個繼承其他接口的接口,則該類必須實現這個接口和其父接口的所有方法。
     包:是爲每個java類提供一個命名空間。聲明:package packageName;如:package p1.p2表示該類在p1下的p2下。import用於包含所需的類。
    
數組和字符串類型
  一維數組:定義:type arrayName[];type[] arrayName;在數組聲明中不用指定數組中元素的個數。儘管聲明瞭數組類型的變量,但實際上該數組的內存空間並不存在,每個元素值爲Null,必須用new申請。
   數組初始化:用new爲動態申請過程,格式:arrayName=new type[size].如果知道元素的個數,可以在定義時直接申請數組內存空間,如:int a[]={1,1,1};
   訪問數組:下標起始爲0,最後一個長度(length)減一
  多維數組:定義:二維數組 type arrayName[][];或type[][] arrayName;
   動態申請:arrayName=new type[size1][size2],靜態初始化:int nArray3={{1,2,3,4}{2,3}{4,5,6}}.
   訪問:a[m][n]
   
   字符串類型:java把字符串作爲對象處理,類String和StingBuffer都可以表示一個字符串。
    初始化:String s="hello";StringBuffer sf=new StringBuffer("hello");
    訪問和修改字符串:
      常用方法:
      string:
        1、length()返回個數;
        2、charAt(int index)返回串中index上的字符,index在0~length-1;
        3、indexOf()和lastIndexOf()分別返回ch在串中出現的第一個和最後一個的位置。還有indexOf(String str,int fromIndex)和lastIndexOf(String str,int fromIndex);
        4、getChars(int srcbegin,int end,char buf[],int dstbegin):從字符串中提取從srcbegin到end的字符放在buf[]中。
        5、subString([int beginIndex,int endIndex]):取指定位置的字符串。
        6、toUpperCase()和toLowerCase:轉換大小寫
        7、concat(String str):把當前字符串對象與str連接起來。
        8、replace(char oldChar,char newChar):將出現的特定字符轉換成指定字符。
        9、compareTo(Object o):將字符串與一個java對象比較,如果不是字符串對象則產生異常。compareTo(String anotherString),comparToIgnoreCase(String str):不分大小寫。返回0表示相等。
        10、copyValueOf(char[] data,int offset,int count):字符數組到字符串間的轉換。
        11、getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin)字符串到字符數組間的轉換。
        12、endsWith(String suffix):判斷字符串是否由指定的suffix爲結束,真爲ture
        13、equals(Object o)equalsIgnoreCase(String anotherstring):判等。
      StringBuffer:
        append:添加到字符串緩衝區的後面;insert:插入;toString:轉換成字符串;delete(int start,int end):刪除;SetLength(int newLength):設置長度;reverse:反轉。capacity:獲得剩餘長度,整數。+:連接。
    
     StringTokenizer類:用於分析字符串,目的將字符串分解的方法封裝。
      StringTokenizer(String str,String delim,boolean return Tokens),解析時字符串必須包括一個用於解析的分隔符。默認的爲空格、製表符、換行符、回車符。也可以通過delim自定義。
      方法:1、countTokens()返回分隔符的數量。2、hasMoreTokens()判斷是否還有分隔符、nextToken()下一個、nextToken(String delim)
    字符串與其他數據類型的轉換:
      其他對象轉成字符串:toString()
      字符串轉成其他對象:可以調用Integer、Double等類的valueOf轉換。i=Integer.parseInt(s1);
           
異常處理
  java通過面向對象的方法處理。如果發生了異常,用此方法生成代表該異常的一個對象,並把它交給運行時的系統,這叫作拋出(throw)異常。系統從生成異常的方法開始進行回溯,直到找到包含相應異常處理的方法爲止,叫做異常捕獲(catch)。try{}catch{}
  main()方法是有參數的,參數是一個字符串數組,如:public static void main(String[]args){}
  異常處理類:Throwable類是最頂層類,包含兩個直接類:Error(不由應用程序直接處理,需交給操作系統處理)和Exception(是java程序處理或拋出的對象)
  常用異常對象:
    1、算數異常ArithmeticException:除0,或0取模等。
    2、空指針NullPointerException:訪問一個沒有定義的對象或只定義沒有實例化的對象的變量或方法,或訪問一個空數組的元素時。
    3、類型轉換異常ClassCastException:在類型轉換過程中,無法轉換導致異常;
    4、數組超界異常ArrayIndexIndexOutOfBoundException:試圖範圍數組的一個非法元素。
    5、指定數組下標爲負值異常NegativeArraySizeException:對於動態創建的數組,如果指定的數組長度爲負。如a[-1]=1;
    6、數據格式異常NumberFormatException:試圖將數值直接轉換成字符串,如:str=(String)n;
    7、內存溢出異常:OutOfMemeoryException:程序中申請的內存空間太大,內存不夠,如:int[]nArray=new int[100000];
    8、沒有找到類定義異常NoClassDefFoundException:根據包路徑沒有找到指定類。
    9、非法線程狀態異常IllegalThreadStateException:由於將線程的狀態進行非法改變引起。
  異常處理:try{//可能出現異常的代碼}
            catch(ExceptionType1 e){exception handing code throw(e)//異常處理}
            finally{//最終處理方法}
   用throw拋出異常,可以同時拋出多個異常。
   異常捕獲:當程序拋出異常後,由產生異常的程序代碼位置跳轉到異常捕獲語句,進行程序異常處理,異常處理結束後,將跳出捕獲處理嵌套,執行其他部分,而不是從異常語句後執行。
   finally語句:無論try指定的程序是否異常,finally都要執行。
   異常也有嵌套處理。用戶也可自定義異常,必須時Throwable的子類,推薦以Exception爲父類。
  
輸入/輸出及文件操作
  流(Stream):指計算機各部件間的數據流動,有輸出流(output stream)和輸入流(input stream)。數據流是java 發送和接收數據的一個通道。java流類都封裝在java.io包中,其中InputStream和OutputStream是java.io包中的兩個抽象類,分別是其他輸出、輸入流類的超類,他們不能被實例化,但可以通過子類建立對象實體,他們都是從java.lang.object類繼承來的。

  java還提供了系統的輸入、輸出描述符,它們在System類中被定義,System.in對應於輸入流;System.out對應於輸出流,System.err對應於標準錯誤輸入設備;三個分別定義在java.lang.System包中,編譯時自動裝載,可以使用InputStream stdin=System.in;

  java中輸入、輸出處理的類構造層次:在io包中有:
    FileInputStream:對應於文件系統的輸入;Output表示輸出,下同
    PipedInputStream:用於進行管道方式的;
    ByteArrayInputStream:用於讀寫內存數據;
    StringBufferInputStream:用於從StringBuffer中讀取字符數據;
    SequenceInputStream:用於將多個輸入流連接到一個輸出流。沒有output
    FilterInputStream:爲過濾流提供了統一接口,使得在數據輸入輸出時進行數據處理。
    DataInputStream:用於進行與計算機無關的數據讀寫;
    BufferedInputStream:在進行數據讀寫時將數據保存在數據緩衝區中,提高讀寫速度。
    LineNumberInputStream:可以在數據讀寫中記錄讀取的行數,沒有output
    PushBackInputStream:包含一個字節的緩衝區,使得在讀取數據時預讀下一個字符。
    PrintStream:提供輸出方法
    File類中封裝了用於本地文件處理的方法
    FileDescriptor:提供文件描述處理
    RandomAccessFile:用於在磁盤中進行文件的隨機讀寫
    StreamTokenizer用於把流中的內存分解爲記號(Token),通常用於文本文件的解析
    DataInput和DataOutput是接口。
  文件處理:File類,java.io.File,成員變量包括:Static String PathSeparator和Static Char PathSeparatorChar;構造函數:File(String parent,String child) 如:File("c:/java",test.java); 和
File(String parent,String child) 如:File("java",test.java);  和File(String Pathname) 如:File("c:/java/test.java");
 
  Reader與Writer類:處理字符流(character stream),即純文本文件。而InputStream和OutputStream類處理位流(bit Stream),即二進制文件。通常不直接使用這兩個類,而是根據其子類來創建實例對象。
  FileReader和FileWriter類:繼承Reader與Writer類,使用前先調用其構造方法創建相應的對象,然後調用相應的read()或write()方法。write不覆蓋,追加。
  BufferedReader和BufferedWriter類:繼承Reader與Writer類,用來讀取寫緩衝區的數據。在使用BufferedReader類,必須先創建FileReader類對象,其有兩個構造方法:BufferedReader(Reader in),BufferedReader(Reader in,int size),
  如:BufferedReader br=new BufferedReader(new FileReader("c://java//test.txt"));BufferedWriter類類似。
 
  RandomAccessFile類:文件處理中,功能齊全、文件訪問方式衆多的類。用於進行隨意位置、任意類型的文件訪問,支持文件的任意讀取而不是順序讀取。構造函數爲:RandomAccessFile(File file,String mode);RandomAccessFile(String name,String mode);分別提供文件對象和字符串對象參數來指定文件名和目錄樹位置,而mode表示創建的隨機讀寫文件的操作狀態,如:r,rw;
  在創建了一個隨機文件對象後,該文件即打開狀態,此時,文件的指針處於文件的開始位置,可通過seek(long pos)方法設置文件指針的當前位置,快速定位。而後通過RandomAccessFile類中的相應read()和write()方法。操作完成後,調用close()關閉。
 
  InputStream和OutputStream類:兩個抽象類,是其他流類的超類,不能被實例化,只有子類建立真正的對象實體。常用的子類:
    FileInputStream和FileOutputStream類:處理“位爲主”的輸入輸出工作,對文件中的數據流是順序讀寫而不是利用文件指針隨機定位讀寫。
  PipedInputStream和PipedOutputStream類:提供利用管道方式進行輸入和輸出管理的類,是InputStream和OutputStream類的直接子類,這兩個類必須結合使用,其中:管道輸入流作爲管道的接受端、管道的輸出流作爲管道的發送端。
  SequenceInputStream類:是InputStream的直接子類,功能是將多個輸入流連接在一起,形成單一的輸入流,沒有對應的輸出數據流存在。順序輸入流由多個輸入流構成,當一個流讀取數據遇到EOF時,SequenceInputStream將自動轉向輸入流,直到構成讀取最後一個輸入流遇到EOF.
 
  過濾流:FilterInputStream和FilterOutputStream類,它必須連接到輸入、輸出流中,其方法是在構造方法的參數中指定。如:FilterInputStream(InputStream in)
    DataInputStream和DataOutputStream類是FilterInputStream和FilterOutputStream類的子類,實現了DataInput和DataOutput接口,用於進行與操作系統類型無關的數據輸入輸出操作。
    BufferedInputStream和BufferedOutputStream類:用於進行緩衝區數據的讀取操作。
      重要成員變量:protected byte[] buf:字節數組buf表示與緩衝區輸入流相對應的字節緩衝區。
                    protected int pos:整形變量pos表示緩衝區中的當前位置。
                    protected int count:整形變量count表示緩衝區中的字節數量。
    LineNumberInputStream類:提供對文本輸入數據流加行號,編號從0開始,沒遇到一個換行符,行號加1。
     
java圖形用戶界面(Graphics User Interface)簡稱GUI
  java提供AWT和Swing兩個包進行圖形用戶界面編程。AWT是Swing的基礎,Swing是帶豐富組件的GUI工具包,組成JFC(Java Foundation Class)的用戶界面的核心部分,是AWT的替代品。
  AWT包(Abstract Window Toolkit):提供基本的組件,主要有圖形界面、事件處理對象、圖形和圖像、佈局管理器等。java.awt包中的Component類幾乎是所有圖形界面的父類。
  容器組件:容器類(Container)是Component類的子類,主要有Panel、Window、Frame、Dialog。
    用Frame建立窗口:Frame是Window類的子類,構造方法:Frame([String strCaption Text])創建一個指定了窗口標題的窗口框架。
      通常在編程時,不直接使用Frame類創建窗口,而是定義它的子類來完成窗口的創建功能。
        如:用public class extends Frame
              {  public frame2(String str)
                  { super(str);   }
    對話框(Dialog)組件:用來與用戶的交互,與框架窗體(Frame)的區別是:不能自動實現菜單、倚賴其他窗口、有模式(model)和非模式(modeless),模式讓程序相應對話框內的事件,而非模式則可相應其他窗體的事件。
     構造方法:Dialog(Frame ParentWindow[,String strTitle],boolean modal):當modal爲true時創建模式對話框。
   文件對話框(Filedialog)類
     構造方法:FileDialog(Frame frmParent[,String title [,int mode]]):當mode爲FileDialog.SAVE時,則爲保存文件對話框,否則爲打開文件對話框。常用方法:String getFile()獲得文件名,GetDirectory()獲得路徑。
   按鈕(Button)組件:Button([String strCaption])
   標籤組件(Label):Label([String strCaption[,int alignment]]) 創建一個指定字符串,並按一定方式對齊,其中alignment的0左對齊1居中2右對齊。 方法:setText(),setAlignment();
   複選框(Checkbox)組件:在CheckboxGroup類管轄的所有Checkbox中,只能有一個Checkbox處於on狀態。Checkbox([String strCaption[,CheckboxGroup,boolean state]])。方法:setLabel(),setCheckboxGroup,setState,setVisible,setBounds等。
   滾動條組件(Scrollbar):Scrollbar([int orientation[,int s,int v,int min,int max]])方法setOrientation
   Textfield和TextArea組件:單行和多行文本。rows:int表示文本域中能夠顯示文本的行數。getRows和setRows().方法:TextField([String strText,int column]);其中column表示最多能輸入字符數目。
   菜單組件(Menu):包含菜單欄(MenuBar),菜單(Menu),菜單項(MenuItem)
     Frame類是AWT中唯一自動實現MenuContainer類的類,將菜單放入Frame中,只需要調用Frame類的setMenuBar()就能夠放在窗口。
     要創造菜單,首先創建一個MenuBar,然後在它上面創建Menu組件,Menu(String strMenuName);再爲每個Menu創建若干個MenuItem組件,MenuItem(String strMenuItemName);如果將菜單項設爲不可用,調用setEnabled(boolean bEnabled)方法;還有CheckboxMenuItem類可以創建一個可選擇的菜單項CheckboxMenuItem(String strLabelName,boolean bState);快捷菜單:(Popup Menu)
   列表(List)和下拉列表(Choise)等組件與上類似。
   FlowLayout佈局管理器:自左至右,從上而下,默認爲居中對齊,構造方法:FlowLayout([int align[,int hgap,int vgap]]);其中:align對齊方式有FlowLayout.LEFT[.CENTER.RIGHT],hgap行間距,vgap列間距
   BorderLayout佈局管理器:分爲North、South、West、East、Center5塊,方法:BorderLayout([int hgap,int vgap])
   CardLayout佈局管理器:卡片式方式,每個部件看成一張卡片,在一個顯示區域可加入多個卡片,但每次只有一個可見。構造方法:CardLayout([int hgap,int vgap]);void first(Container)顯示第一加入到CardLayout的組件,還有last,next,previous,show(Container,String)
   GridLayout佈局管理器:基於網格的方式,構造方式:GridLayout([int rows,int cols[,int hgap,int vgap]]);
   GridBagLayout佈局管理器:在GridBagLayout基礎上允許一個部件佔用多個顯示單元。構造方法:GridBagLayout()
  
Swing:JComponent類是所有Swing組件的基類,JComponent繼承自java.awt.Container類。
   JFrame是java.awt.Frame的子類。
   JLabel:JLabel([String,Icon,int horizontalAlignment]);setToolTipText設置提示信息。
   JButton、JCheckBox、JradioButton
     JButton([String,Icon]),是AbstractButton子類,無論何時激活按鈕,都可調用按鈕動作監聽器ActionListener的actionPerformer()方法。
     JCheckBox是從JToggleButton類派生出來,JCheckBox([String,Icon,boolean])
     JRadioButton和JCheckBox幾乎相同,JRadioButton([String ,Icon,boolean])
   JTextField、JTextArea、JPasswordField
   JList:可單選、單間隔選和多間隔選,唯一可以修改數據的方法是setListData()
   JComboBox:可編輯,通過設置setEditable(true),支持鍵選取。
   用戶界面風格。默認是跨平臺的java風格,可以通過java的javax.swing包中的UIManager類中的setLookAndfeel方法設置,可有1、java風格(cross),可在任何平臺顯示,2、系統風格(system),與系統有關,3、motif風格,任何平臺,某些構件爲立體,4、蘋果風格(mac)
    
----------------------------------------                 
JDBC:Java DataBase Connectivity縮寫,即java數據庫連接接口
  JDBC是一組由java類、接口組成的API(Application Programming Interface,應用程序接口)
  在兩層結構中,JDBC通常位於應用程序層,客戶機直接發起數據查詢請求。在三層中,客戶機和服務器間增加了一箇中間服務器,JDBC通常成爲服務層。
  JDBC驅動的四種類型,1、JDBC-ODBC橋,將JDBC的調用轉換成ODBC的調用,需要多層轉換,效率較差。
                      2、java到本地API:native-API partly-java使用java程序直接調用數據庫提供的客戶端鏈接庫。
                      3、網絡純java驅動:通過3層方式JDBC的調用會通過網絡傳人中間層的服務器,中間層負責和數據庫通信。
                      4、本地協議純java驅動:將JDBC的調用轉換成爲數據庫所提供的本地協議,客戶端可直接和數據庫通信。
  JDBC中主要的接口和類:JDBC API提供的類和接口在java.sql包中定義
    java.sql.DriverManager類是JDBC的管理器,作用與java程序和驅動之間,用於管理、跟蹤和建立連接。
    java.sql.Date和Time類是java.util.Date的子類:public Date(long date)或public Date(int year,int month,int day)
    java.sql.PreparedStatement是Statement接口的子接口,代表一個預編譯的SQL語句。
    java.sql.CallableStatement是PreparedStatement接口的子接口
  與數據庫建立連接,建立連接後,用戶得到一個java.sql.Connection類的對象,對數據庫的操作都是基於這個對象。
    1、加載驅動程序。有兩種方式:a,在JDBC的java.sql.DriverManager類初始化過程中,通過設置java屬性中的sql.driver來指定驅動程序列表。b,在程序中用Class.forName()方法加載指定的驅動程序。如:Class.forName("sun.jdbc.odbc.jdbcodbcDriver")
    2、創建連接:通常,連接是通過構造數據庫的URL對象,並由DriverManager的getConnection方法建立。構成方式爲:jdbc:subProtocol:subName:其中jdbc是表示當前通過java的數據庫連接訪問數據庫;subProtocol表示通過某種驅動支持的數據庫連接機制;subname表示當前連接機制下的具體名稱。如:String url='jdbc:odbc:student';Connection con=DriverManager.getConnection(url);通常還需要用戶名和密碼:DriverManager.getConnection(url,'userID','passwd');
  執行查詢語句:在java中,定義了3種類型的Statement;1、Statement用於執行簡單的,沒有參數的SQL語句。2、PreparedStatement:Statement類的子類,用於執行帶In和Out參數的語句。3、CallableStatement PreparedStatement類的子類,用於執行存儲過程。Connection類的creatStatement方法用於建立一個Statement對象,如下:Statement stmt=con.createStatement()
   處理查詢結果:使用executQuery方法執行,返回一個ResultSet類對象:ResultSet rs=stmt.executeQuery("SELECT * FROM DUAL");更新可以用executeUpdate(String sql)
   JDBC提供了流方式來讀取記錄中存儲內容較大的數據。JDBC API提供了3個獲取流的方法,區別在返回數據類型的不同:getBinaryStream()返回原始數據庫記錄的二進制數據;getAsciiStream()返回ASCII字符;getUnicodeStream()返回兩個自己編碼的Unicode字符。
  
java與XML編程
  XML(Extensibel Markup Language)可擴展標記語言。不管使用XML的是哪種平臺或程序,它都可以用來描述信息,與其他標記語言不同,XML與使用他的程序無關。另外,XML允許用戶創建自己的標籤和這些標籤的語法。
  XML文檔可以從數據處理指令<?xml version="1.0"?>開始,知道使用XML1.0版本。XML元素必須有一個打開和關閉標籤,即使是空元素,如:<DOCUMENT></DOCUMENT>。XML中屬性的格式爲:attributename="value",可爲每個元素指定附加的數據。
  XML解析器:XML應用常基於一個XML解析器而創建的,它爲用戶提供一個接口。解析器可讀入一個文檔並分析其結構的代碼。有以下幾類: 1、驗證或非驗證解析器:XML文檔如果使用一個DTD(Document Type Definition),並符合DTD中的規則將被稱爲有效文檔。符合基本標記規則的XML文檔被稱爲格式正確文檔。如果不是格式正確要報錯,驗證解析器在解析XML文檔的同時進行驗證,需要相當大的開銷;非驗證解析器則忽略所有的驗證錯誤。
   2、文檔對象模型(DOM)是W3C的正式推薦。DOM不是一種實現,支持DOM的XML解析器必須實現DOM所定義的接口。常用接口:org.w3c.dom.Node:DOM中的主要的數據類型;Nodelist:節點集合;Document:一個完整的XML文檔;Attr:表示元素的某個屬性;Element:表示一個元素;Text:表示字符數據;NamedNodeMap:表示一個可以有名稱引用的節點集合。
   3、XML簡單應用程序編程接口:SAX處理XML的方式與DOM API不同,他不是將DOM樹解析和表現爲輸出。使用SAX解析器,可以在文檔的開始接收事件,也可以接收文檔中的元素。
   使用DOM處理XML文檔。創建DOMParser類的實例變量parser,然後調用該類的parser方法並傳遞XML文件名稱。
     如:DOMParser parser=new DOMParser();
         parser.parser("weather.xml");
         Document dom=parser.getDocument();
     然後獲得文檔的根和元素:NodeList nList=dom.getElementsByTagName("Houston");
                              for(int i=0;i<games.getLength();i++)
                              {Node node=nList.item(i);System.out.println(node.getFirstChild().getNodeValue());}
     獲取了元素後,可以查看所有屬性,可以通過使用Node接口的getAttributes方法,如:
       NamedNodeMap attribute=node.getAttributes();
       For(int i=0;i<attribute.getLength();i++)
       {Node att=attribute.item(i); System.out.println(att.getNodeName()+"="+att.getNodeValue);}
   使用DOM創建XML文檔:通過DOMImplementation接口的createDocument方法類實現,元素的創建是調用Document接口的createElement方法,還可以通過Element接口的setAttribute方法增加屬性。
   SAX API應用
     SAX是解析XML文檔的一個事件驅動的API,它以事件爲基礎,把元素、指令等都當成事件,常用事件:startDocument開始事件,endDocument結束事件等。
   使用XML可以使用戶界面的創建和維護更方便。不用修改java源代碼,只需修改XML文檔。
  
命名服務和目錄服務
  命名服務(Naming Service):爲某個對象取個名字。
  解析(Resolve):通過名字訪問或得到一個對象。  
  上下文(Context)指一組綁定的集合,可以有SubContext,就像子目錄。
  命名系統(Naming System):指同類的Context集合,同類表示同樣的命名規則。如文件系統
  命名服務(Naming Service):命名系統提供的服務或功能。如文件系統通過文件名來查找、刪除等
  名字空間(Name Space):指命名系統中所有名字的集合
  目錄服務:是命名系統的擴展,不僅把名字和對象綁定在一起,對象還有屬性,可通過屬性來搜索對象。如電話簿。
 
  java命名和目錄服務
    軟件:1、JDK/java名字和目錄API:java中的提供名字和目錄服務的類庫(API)稱爲java命名和目錄接口(The java Naming and Directory Interface,JNDI),JDK1.3以後的版本都包含了這些API。
          2、Sevice Provider Software(服務提供者軟件)JNDI是"虛"的,名字和目錄服務是"實"的,爲了能使用某種服務,必須有個服務提供者軟件,JDK1.4.1中已經包含了一些目錄服務,其他的可從SUN公司的網站上下載相關的Service Provider;
          3、名字和命名服務:不同的服務器的安裝、設置和使用方法都不相同。
    文件系統的服務器提供者和服務器,需要另外下載:fscontext.jar和providerutil.jar,複製到JDK下的JRE/LIB/EXT即可。
   JNDI體系結構:包含API(應用程序編程接口)和SPI(服務供應器接口),java應用程序首先通過Context和DirContext接口,使用JNDI API訪問命名和目錄服務。JNDI API 在javax.naming.directory包中定義。
   文件系統的命名服務
     引用上下文:文件系統的操作都要通過Context和與其相關的接口和類。
       JNDI用javax.naming.Context接口表示命名系統中的上下文。Context對象不像File對象,File對象可以告訴我們絕對和相對名字並返回父類的引用,而Context對象只知道他的綁定,而不能知道其絕對路徑名。
       javax.naming.InitialContext類實現Context接口並充當命名系統的進入點,所以首先建立InitialContext對象,如:Hashtable env=new Hashtable();                      env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory");--基本屬性鍵java.naming.factory.initial對應常量Context.INITIAL_CONTEXT_FACTORY,該屬性指定JNDI服務供應器中的廠類名。廠類的任務是建立一個與服務相應的InitialContext,並返回該對象。
env.put(Context.PROVIDER_URL,file:///); --指定廠類從java.naming.provider.url屬性中獲取協議、服務名和路徑,就文件系統來說,可以蔣上述目錄指定維名字空間範圍,當確定這個目錄後,命名服務只能在這個目錄進行,目錄外的不可訪問。
Context ctx=new InitealContext(env);
  得到Context對象後,可以通過lookup方法指定要查找的Context的孩子的名字。Lookup方法返回這個名字鎖定的對象,類型爲Object。如:Object obj=ctx.lookup("zyd");最後在結束前,用close方法關閉Context.
    文件名綁定的是文件地址,而目錄綁定的是RefFSContext,是一種Context類型。
   文件系統的常用方法:
     list和listBindings顯示Context中的內容
     createSubcontext和destroySubcontext建立和刪除Context.
     rename更改文件名。
  JNDI對象綁定:建立Initial對象後,程序即可查找現有的對象並向Context環境綁定新的對象。綁定對象是指向JNDI服務添加名字,並將這個名字和java對象關聯。如:private final static String JNDI="java/book"
  Context ctx=new InitialContext();
     ctx.bind(JNDI,"Java 2 Programing");
    被綁定的對象必須實現Serializable接口,可通過rebind重新綁定,如:ctx.rebind("java/book","This is rebind");也可通過Context.unbind()方法刪除一個對象。因爲程序關閉時綁定的名字不會被自動解開。
   
網絡通信
   TCP和UDP是當前最常用的兩個網絡協議,網絡通信是通過TCP協議和UDP協議完成兩個計算機間點對點的數據交換。在java.net包中的Socket類和DatagramSocket類完全封裝了協議通信的細節。
   TCP(Transmission Control Protocol)是傳輸控制協議。
   UDP(User Datagram Protocol)用戶數據報協議是一種基於無連接的協議。採用一種稱爲“數據報”的短信息來傳輸。不管傳輸正確與否,也不保證正確次序。
   在TCP協議中,端口被規定爲介於0~65535的整數,並且端口0~1023是系統爲HTTP、FTP傳輸保留的端口。利用TCP通信時,兩個程序只有地址和端口達成一致時,才建立連接。而UDP則不同,UDP是一種無連接的協議,所以可以隨時進行收發數據報,速度較快,但不可靠,數據報的容量不能太大(不能超過64KB)。
   java中和網絡通信有關的類都集中在java.net包中。
   URL(Uniform Resource Locator)是Internet中對網絡資源進行統一的定位和管理。完整的URL包括以下內容:1、應用協議名稱,如http/ftp等;2、資源位置,由.分割的網絡路徑,如www.sina.com。3、端口號4、文件路徑。5、訪問文件名6、文件中的編碼位置。
   URL類是java.lang.Object類的直接子類。構造函數URL(String protocol,String host,int port,String file,URLStreamHandler handler);URL(URL context,String spec):在提供上下文對象中匹配spec字符串來創建URL對象。如:URL aURL= new URL(www.sina.com);
   定義了MalformedURLException異常。
   InetAddress類用於網絡地址的解析和編碼。沒有構造方法,即不能通過構造函數的方式創建InetAddress的實例。可以通過以下獲取實例:1、InetAddress getLocalHost()獲取本地主機的ip;2、InetAddress getByName()或InetAddress getAll-ByName()通過主機名獲取IP地址。其成員方法還包括:Boolean equals(Object obj)判斷IP是否相同,Byte[] getAddress()取得IP地址,String getHostName()取得IP地址的主機名。
   Socket(套接字)通信:是實現客戶機和服務器進行通信的一種機制。他是兩臺計算機進行通信的端口。在java中,可以將Socket類和ServerSocket類分別用於客戶機和服務器,分別創建Socket,然後連接通信。
   Socket編程的客戶端用Socket類:構造方法:Socket(InetAddress address,int port,InetAddress localAddr,int localPort);Socket(String host,int port,InetAddress localAddr,boolean stream)等。其中:InetAddress爲java中定義統一地址模型的類,參數address指定Socket通信指定的ip.port爲端口,範圍大於等於1024。host表示字符串形式的主機名稱。布爾值stream爲true則創建Socket流對象,否則創建數據報表Socket對象。如:Socket(166.111.102.101,1800,166.111.102.102,2000)表示從IP爲102的計算機的2000端口向101的1800端口發出連接請求。
   服務端用ServerSocket類,構造方法:ServerSocket(int port,int backlog,InetAddress addr)其中:addr在創建套接字的同時指定主機的IP地址。如:ServerSocket aServerSocket=new ServerSocket(1800,0,166.111.102.101);
   利用Socket方式進行數據通信與傳輸,大致包括如下步驟:
      1、創建服務器ServerSocket,設置建立連接的端口號;
      2、創建客戶機Socket,設置綁定的主機名稱或IP地址,指定端口號
      3、客戶機發起請求
      4、建立連接
      5、取得InputStream和OutputStream
      6、利用InputStream和OutputStream進行數據傳輸
      7、關閉Socket和ServerSocket
    傳輸時可設置傳輸屬性:1、SO_RCVBUF接收緩衝區的大小2、SO_SNDBUF發送緩衝區的大小3、SO_LINGER閒置時間4、SO_TIMEOUT超出時間5、TCP_NODELAY非延遲時間。
    支持多客戶連接的Socket通信方式,應用多線程。
    數據報通信DatagramSocket是面向無連接的通信方式。
    DatagramSocket和DatagramPacket類
      DatagramSocket的作用是在發送主機中建立數據報通信方式,提出發送請求。而DatagramPacket則用於表示要進行傳輸的數據報。
      DatagramSocket的構造方法:DatagramSocket(int port,InetAddress address)等。
      DatagramPacket的構造方法:DatagramPacket(byte[] buf,int offset,int length,InetAddress address int port) 

 

------------------------------------------------------------
14 JAVA多線程處理
   線程是比進程更小的執行單位。
  java線程類與Runnable接口
    實現多線程的方法:
      1、繼承java.lang包中的Thread類,2、用戶自己的類實現Runnable。
    Thread類
      優先級:static int MAX_PRIORITY 最大;MIN_PRIORITY 最小; NORM_PRIORITY 默認;
      構造方法:Thread([ThreadGroup group,Runnable targer,String name]);
    Runnable接口
      Runnable接口只有一個方法run(),用戶定義的類必須實現這個方法。
  線程管理
    線程的生命週期:1、初始狀態;2、就緒狀態;3、阻塞狀態;4、運行狀態;5、死亡狀態。
    線程的調度:調度實際是分配處理器資源,java用調度程序。搶佔式的調度,優先級高的先執行。如果相同,採用FIFO方法排隊。
    守護(Daemon)線程:如果是守護線程,當線程運行結束後,只要有另一個用戶線程在運行,該線程就可以繼續運行。
  線程同步
    同步關鍵字synchronized,通常將線程的執行方法設爲同步。如果線程使用的同步方法需要其他線程修改後才行,則在同步方法中使用wait()方法,即本線程等待,並運行其他線程使用這個方法,當使用完這個同步方法後,用notifyAll()或notify()方法通知所有的等待線程,使其結束等待,再使用這個方法。若想同步某程序段,則可以使用synchronized(object){}方法。
  線程中的sleep、yield和join方法區別
    sleep讓線程睡眠,可使低優先級的線程執行
    yield讓線程暫停,只能使同優先級的線程執行。
    join能使調用該方法的線程在此之前執行完成。
  爲避免死鎖,java1.2後反對使用Thread的stop()、suspend()、resume()和destroy()等.
  線程組ThreadGroup類:線程組中可以包含多個線程和其他線程組;ThreadGroup(ThreadGroup parent,String name);
       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章