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

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

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

    記錄點(diǎn)滴

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      10 Posts :: 1 Stories :: 1 Comments :: 0 Trackbacks
    配置java環(huán)境變量:
    ?? ?JAVA_HOME:配置JDK的目錄
    ?? ?CLASSPATH:指定到哪里去找運(yùn)行時(shí)需要用到的類代碼(字節(jié)碼)
    ?? ?PATH:指定可執(zhí)行程序的位置
    ?? ?
    ?? ?LINUX系統(tǒng)(在" .bash_profile "下的環(huán)境變量設(shè)置)
    ?? ??? ?JAVA_HOME=/opt/jdk1.5.0_06
    ?? ??? ?CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
    ?? ??? ?PATH=$PATH:$JAVA_HOME/bin:.
    ?? ??? ?export JAVA_HOME CLASSPATH PATH???? (將指定的環(huán)境變量聲明為全局的)
    ?? ??? ??? ?
    ?? ?windows系統(tǒng):
    ?? ??? ?右擊我的電腦-->屬性-->高級(jí)-->環(huán)境變量
    ?? ??? ?
    Java的運(yùn)行過程:
    ?? ?編譯:生成可執(zhí)行文件,如C++中利用g++生成a.out,效率高,但不跨平臺(tái)
    ?? ?解釋:解釋器把源文件逐行解釋,跨平臺(tái)但效率不高
    ?? ?
    ?? ?在java中:先編譯后解釋,把.java文件編譯成.class字節(jié)碼文件
    ?? ??? ?Java源代碼文件(.java文件)--->
    ?? ??? ?Java編譯器(javac)--->
    ?? ??? ?Java字節(jié)碼文件(.class文件,平臺(tái)無關(guān)的)--->
    ?? ??? ?Java解釋器(java),執(zhí)行Java字節(jié)碼
    ?
    Java的垃圾回收:
    ?? ?由一個(gè)后臺(tái)線程gc進(jìn)行垃圾回收
    ?? ?虛擬機(jī)判定內(nèi)存不夠的時(shí)候會(huì)中斷代碼的運(yùn)行,這時(shí)候gc才進(jìn)行垃圾回收
    ?? ?缺點(diǎn):不能夠精確的去回收內(nèi)存
    ?? ?java.lang.System.gc();?? ?建議回收內(nèi)存,但系統(tǒng)不一定回應(yīng),他會(huì)先去看內(nèi)存是否夠用,夠用則不予理睬,不夠用才會(huì)去進(jìn)行垃圾回收
    ?? ?內(nèi)存中什么算是垃圾:
    ?? ??? ?不在被引用的對(duì)象(局部變量,沒有指針指向的)
    ?? ??? ?
    java的安全性:
    ?? ?沙箱機(jī)制:只能做沙箱允許的操作
    ?? ?通過下面環(huán)節(jié),實(shí)現(xiàn)安全
    ?? ??? ?加載有用的類文件,不需要的不加載
    ?? ??? ?校驗(yàn)字節(jié)碼,查看允許的操作
    ?? ??? ??? ?查看代碼和虛擬機(jī)的特性是否相符
    ?? ??? ??? ?查看代碼是否有破壞性
    ?? ??? ??? ?查看是否有違規(guī)操作,如越界
    ?? ??? ??? ?查看類型是否匹配,類型轉(zhuǎn)換是否能正確執(zhí)行
    ?? ??? ??? ?
    源程序:
    ?? ?package mypack;?? ??? ?//相當(dāng)于一個(gè)目錄
    ?? ?
    ?? ?public class HelloWorld{
    ?? ??? ?public static void main(String[] args){
    ?? ??? ??? ?System.out.println(“Hello World”); ?
    ?? ??? ?}
    ?? ?}
    ?? ?注:
    ?? ??? ?1、文件名必須和public修飾的類名一致,以.java作為文件后綴,如果定義的類不是public的,則文件名與類名可以不同。
    ?? ??? ?2、一個(gè).java文件中可以有多個(gè)class,但是只有一個(gè)public修飾的類。
    ?? ??? ?3、java源代碼文件編譯后,一個(gè)類對(duì)應(yīng)生成一個(gè).class文件
    ?? ??? ?4、一個(gè)java應(yīng)用程序應(yīng)該包含一個(gè)main()方法,而且其簽名是固定的,它是應(yīng)用程序的入口方法,可以定義在任意一個(gè)類中,不一定是public修飾的類
    ?? ??? ?編譯:javac -d . HelloWorld.java
    ?? ??? ??? ?含有包的類,在編譯的時(shí)候最好用上面的格式,-d指的是讓該類生成的時(shí)候按照包結(jié)構(gòu)去生成," . "指的是在當(dāng)前路徑下生成
    ?? ??? ??? ?如果不用上面的格式,也可以用javac HelloWorld.java,但是需要注意的是包結(jié)構(gòu)就要由自己去建立,然后將生成的.class文件放到該目錄下
    ?? ??? ?執(zhí)行:java mypack.HelloWorld
    ?? ??? ??? ?將字節(jié)碼文件交給Java虛擬機(jī)去解釋執(zhí)行
    ?? ??? ??? ?需要注意的事,必須使用包名.類名去解釋執(zhí)行
    ?? ??? ??? ?
    包(package):把源文件放在目錄下
    ?? ?由于工程的需要,將不同的源文件放在不同的目錄下,從而引入了包。
    ?? ?包可以看作就是一個(gè)存放java源文件的目錄。
    ?? ?在源碼中聲明一個(gè)包名:package p;(只能放在第一行,且最多只能是一行)
    ?? ?如果指定多層包,那么在包名之間我們可以用.作為分隔符:package p1.p2.p3.p4;
    ?? ?用“javac HelloWorld.java –d 絕對(duì)路徑”,編譯后生成的字節(jié)碼文件就會(huì)放在指定的包結(jié)構(gòu)下
    ?? ?執(zhí)行該程序需要用" java 包名.類名 "
    ?? ?引進(jìn)包中的某個(gè)類:import 包名.類名;
    ?? ?引進(jìn)包中的所有類:import 包名.*;
    ?? ??? ??? ?
    注釋:
    ?? ?//?? ?單行注釋, 到本行結(jié)束的所有字符會(huì)被編譯器忽略
    ?? ?/* */?? ?多行注釋,? 在/*? */之間的所有字符會(huì)被編譯器忽略
    ?? ?/**? */ ??? ?文檔注釋, java特有的,在/**? */之間的所有字符會(huì)被編譯器忽略
    ?? ?可以用javadoc把java源程序中這種注釋抽取出來形成html頁(yè)面(只有寫在包,類,屬性,方法,構(gòu)造器,引入之前的注釋才可以進(jìn)行抽取)
    ?? ? ??? ?
    標(biāo)識(shí)符:
    ?? ?命名規(guī)則:
    ?? ??? ?(1) 由字母、數(shù)字、下劃線、$組成,不能以數(shù)字開頭
    ?? ??? ?(2) 大小寫敏感
    ?? ??? ?(3) 不得使用java中的關(guān)鍵字和保留字
    ?? ?
    ?? ?關(guān)鍵字:都是小寫的,jdk1.2多了strictfp(經(jīng)準(zhǔn)浮點(diǎn)型),關(guān)鍵字 jdk1.4多了assert(斷言)關(guān)鍵字,? jdk1.5多了enum(枚舉) 關(guān)鍵字
    ?? ??? ?隨著學(xué)習(xí)進(jìn)度,會(huì)慢慢接觸到的
    ?? ??? ?true、false、null嚴(yán)格說不應(yīng)該算關(guān)鍵字,應(yīng)稱其為保留字更合適
    ?? ?
    ?? ?習(xí)慣:
    ?? ??? ?(1) 標(biāo)識(shí)符要符合語(yǔ)義信息
    ?? ??? ?(2) 包名所有字母小寫
    ?? ??? ?(3) 類名每個(gè)單詞首字母大寫,其它小寫 //TarenaStudent
    ?? ??? ?(4) 變量和方法:第一個(gè)單詞小寫,從第二個(gè)單詞開始首字母大寫 //tarenaStudent
    ?? ??? ?(5) 常量:所有字母大寫,每個(gè)單詞之間用" _ "連接
    ?? ??? ?
    基本數(shù)據(jù)類型:8種
    ?? ?1) 整型 ?
    ?? ??? ?byte?????? 1B?? ? 8位?????? -128到127 ?
    ?? ??? ?short????? 2B?? ? 16位????? -2^15到(2^15)-1 ?
    ?? ??? ?int????????? 4B?? ? 32位????? -2^31到(2^31)-1 ?
    ?? ??? ?long??????? 8B?? ? 64位????? -2^63到(2^63)-1 ?
    ?? ?2) 浮點(diǎn)類型 ?
    ?? ??? ?float??????? 4B?? ?? 32位?????? ?
    ?? ??? ?double???? 8B?? ?? 64位 ?
    ?? ?3) 字符類型 ?
    ?? ? ??? ?char?????? 2B?? ?16位 ?? ?
    ?? ?4) 布爾型 ?? ?1B
    ?? ??? ?boolean??? false/true
    ?? ??? ?
    ?? ?注:
    ?? ??? ?1、Java中的自動(dòng)類型提升問題。
    ?? ??? ??? ?1)、正向過程:從低字節(jié)到高字節(jié)可以自動(dòng)轉(zhuǎn)換。
    ?? ??? ??? ??? ?byte->short->int->long->float->double
    ?? ??? ??? ?2)、逆向過程:從高字節(jié)到低字節(jié)用強(qiáng)制類型轉(zhuǎn)換。
    ?? ??? ??? ??? ?例:int a = (int)4.562;
    ?? ??? ??? ??? ?注:逆向轉(zhuǎn)換將丟失精度。
    ?? ??? ? 2、boolean:只有true和false。
    ?? ??? ? 3、char:Java中用" \u四位十六進(jìn)制的數(shù)字 (即使在注釋中出現(xiàn)\u,后面如果跟的不是4個(gè)數(shù)字,也會(huì)報(bào)錯(cuò))"表示將字符轉(zhuǎn)換成對(duì)應(yīng)的unicode編碼,字符類型要用單引號(hào)括起來。
    ?? ??? ? 4、黙認(rèn)浮點(diǎn)類型為double,float數(shù)據(jù)類型有一個(gè)后綴為" f "或" F "。
    ?? ??? ? 5、long類型有一個(gè)后綴,為" l " 或者" L "
    ?? ?
    引用數(shù)據(jù)類型:
    ?? ?類、接口、數(shù)組
    ?? ?引用類型 變量名 = new 引用類型名(參數(shù));?? ??? ?//new后面一般跟的都是類的構(gòu)造器
    ?? ?成員:寫在類體括號(hào)里面的
    ?? ?
    內(nèi)存空間的分配:
    ?? ?內(nèi)存分為:
    ?? ??? ?棧:存放簡(jiǎn)單數(shù)據(jù)類型變量(值和變量名都存在棧中),存放引用數(shù)據(jù)類型的變量名以及它所指向的實(shí)例的首地址
    ?? ??? ?堆:存放引用數(shù)據(jù)類型的實(shí)例

    局部變量:不是聲明在類體括號(hào)里面的變量
    ??? (1)必須要先賦值,后使用,否則通不過編譯,局部變量沒有默認(rèn)初始化值
    ??? (2)作用范圍:定義開始到定義它的代碼塊結(jié)束
    ??? (3)同一范圍內(nèi),不允許2個(gè)局部變量命名沖突
    ?
    ??? 參數(shù)傳遞時(shí),簡(jiǎn)單類型進(jìn)行值轉(zhuǎn)遞??? (參數(shù)進(jìn)行傳遞時(shí)都會(huì)先去棧中生成一個(gè)副本的,使用結(jié)束后釋放)
    ??? ?
    自動(dòng)類型提升:
    ??? byte a = 1;
    ??? byte b = 2;
    ??? a = a+b;????????? //編譯出錯(cuò)自動(dòng)類型提升成int
    ??? a += b;?????? //自加沒有自動(dòng)類型提升問題
    ??? 類型自動(dòng)提升規(guī)則:
    ??? ??? a和b作某種運(yùn)算
    ??? ??? a和b中有double,結(jié)果就是double
    ??? ??? a和b中有float,結(jié)果就是float
    ??? ??? a和b中有l(wèi)ong,結(jié)果就是long
    ??? ??? 除此之外,結(jié)果都是int
    ??? 把高字節(jié)轉(zhuǎn)成低字節(jié),需要作強(qiáng)制類型轉(zhuǎn)換. byte c=(byte)a+b;
    ??? ?
    移位運(yùn)算符:效率最高
    ??? >>?? 有符號(hào)右移,補(bǔ)符號(hào)位
    ??? ??? 移負(fù)數(shù)位,則將該數(shù)值加32后再進(jìn)行移位
    ??? ??? 數(shù)值的2進(jìn)制是按照補(bǔ)碼保存的
    ??? >>>? 右移后高位都補(bǔ)0
    ??? ?
    邏輯運(yùn)算符:
    ??? &/|也可以作為邏輯運(yùn)算符
    ??? &&??? 先判斷前面一個(gè)條件,如果為假,則不用計(jì)算后一個(gè)條件
    ??? ||??? 先判斷前面一個(gè)條件,如果為真,則不用計(jì)算后一個(gè)條件
    ??? ?
    " + "運(yùn)算符:
    ??? 兩個(gè)操作的對(duì)象是數(shù)值時(shí),是加法
    ??? 如果有一個(gè)是字符串時(shí),則是字符串的連接
    ??? ?
    流程控制語(yǔ)句:
    ??? 同Core C++
    ??? switch中的變量類型只能是byte、 short、int、char四種類型
    ??? ?
    數(shù)組:
    ??? 聲明數(shù)組:???
    ??? ??? 數(shù)組能以下列形式聲明:
    ??? ??? ??? 類型[] array;
    ??? ??? ??? 類型 array[];??
    ??? ??? 注:
    ??? ??? ??? JAVA中推薦用:類型[] array;
    ??? ??? ??? 一個(gè)數(shù)組是一個(gè)對(duì)象
    ??? ??? ??? 聲明一個(gè)數(shù)組沒有創(chuàng)建一個(gè)對(duì)象
    ??? ??? ??? 聲明時(shí)不用指定長(zhǎng)度
    ??? ??? ??? ?
    ??? 創(chuàng)建數(shù)組:
    ??? ??? 創(chuàng)建基本數(shù)據(jù)類型數(shù)組:int[] i = new int[2];?
    ??? ??? 創(chuàng)建引用數(shù)據(jù)類型數(shù)組:Student[] s = new Student[100];?
    ??? ??? 數(shù)組創(chuàng)建后其中的元素有初始值
    ??? ??? ??? 類型???????????????????? 黙認(rèn)值?
    ??? ??? ??? byte???????????????????? ??? 0?
    ??? ??? ??? short??????????????????? ??? 0?
    ??? ??? ??? int????????????????????? ??? 0?
    ??? ??? ??? long???????????????????? ??? 0l?
    ??? ??? ??? float??????????????????? ??? 0.0f?
    ??? ??? ??? double?????????????????? 0.0d?
    ??? ??? ??? char???????????????????? ??? \u0000
    ??? ??? ??? boolean??????????????? ??? false?
    ??? ??? ??? reference types??? ??? null
    ??? ??? 注:
    ??? ??? ??? 創(chuàng)建時(shí)一定要指定長(zhǎng)度
    ??? ??? ??? int[] i2=new int[];?????????? ??? //error
    ??? ??? ??? ?
    ??? 初始化數(shù)組:?
    ??? ??? 聲明、創(chuàng)建、初始化分開:?
    ??? ??? ??? int[] i;?? //定義數(shù)組
    ??? ??? ??? i = new int[2]; ??? //分配空間
    ??? ??? ??? i[0] = 0;?? ??? //初始化
    ??? ??? ??? i[1] = 1;?
    ??? ??? ??? ?
    ??? ??? 聲明、創(chuàng)建、初始化在同一時(shí)間 :
    ??? ??? ??? int[] i = {0,1};? ??? //顯示初始化? {}中有幾個(gè)值,則數(shù)組長(zhǎng)度為幾
    ??? ??? ??? Student[] s = {new Student(),new Student()};?
    ??? ??? ??? ?
    ??? ??? 注:??? int[] i=new int[]{1,2,3};???? ??? //后面[]中不可以寫數(shù)值
    ??? ??? ??? int[] i1=new int[3]{1,2,3};?? ??? //error
    ??? ??? ??? ?
    ??? 二維數(shù)組:(其實(shí)是一個(gè)一維數(shù)組,它的每一個(gè)元素又是一個(gè)一維數(shù)組)
    ??? ??? int[][] i1 = new int[2][3];?
    ??? ??? int[][] i4 = {{1,1,1},{2,2,2},{3,3,3}};
    ??? ??? int[][] i3 = new int[][3];??? ??? //不允許高維沒分配空間而先給低維分配空間
    ??? ??? int[][] i2 = new int[2][];?
    ??? ??? i2[0] = new int[2];
    ??? ??? i2[1] = new int[3];?????
    ??? ??? ?
    ??? 數(shù)組長(zhǎng)度:
    ??? ??? 數(shù)組的屬性length
    ??? ??? 數(shù)組長(zhǎng)度一旦確定,不可改變?????
    ??? ??? int[] i = new int[5]; 則i.length= 5
    ??? ??? ?
    ??? 數(shù)組拷貝:
    ??? ??? 系統(tǒng)類System提供的
    ??? ??? static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)?
    ??? ??? ??? src: 源數(shù)組??? ??? ?
    ??? ??? ??? srcPos: 從源數(shù)組哪個(gè)位置開始拷貝(位置指的是元素的下標(biāo))
    ??? ??? ??? dest: 目標(biāo)數(shù)組
    ??? ??? ??? destPos: 拷貝的元素放到目標(biāo)數(shù)組的起始位置
    ??? ??? ??? length: 拷貝多少個(gè)
    ??? ??? ??? ?
    ??? 數(shù)組排序:
    ??? ??? 自己實(shí)現(xiàn)一個(gè)排序方法來進(jìn)行排序
    ??? ??? 或者調(diào)用java.util.Arrays.sort(Object o)
    類和對(duì)象:
    ??? 類:主觀抽象,是對(duì)象的模板,可以實(shí)例化對(duì)象
    ??? ??? 習(xí)慣上類的定義格式:
    ??? ??? ??? package xxx;??? ??? ?
    ??? ??? ??? import xxx;??? ??? ?
    ??? ??? ??? public class Xxxx{
    ??? ??? ??? ??? 屬性 ······;
    ??? ??? ??? ??? ?
    ??? ??? ??? ??? 構(gòu)造器 ······;
    ??? ??? ??? ??? ?
    ??? ??? ??? ??? 方法 ······;
    ??? ??? ??? }
    ?
    ??? ??? 定義屬性:實(shí)例變量
    ??? ??? ??? 格式:[ 修飾符 ]? 類型 變量名? [ = ? ]
    ??? ??? ??? 實(shí)例變量定義在類中但在任何方法之外。
    ??? ??? ??? 實(shí)例變量有默認(rèn)值:各種各樣的0。(同數(shù)組)
    ??? ??? ??? 實(shí)例變量的作用域至少在本類內(nèi)部,受訪問控制符的限制。
    ??? ??? ??? 在重合作用域,實(shí)例變量和局部變量允許有命名沖突,“局部?jī)?yōu)先”。
    ??? ??? ??? ?
    ??? ??? 定義方法:
    ??? ??? ??? 格式: [ 修飾符 ]? 返回類型 方法名( 參數(shù)列表 ) [ throws? 異常 ] { ······ }?
    ??? ??? ??? java中所有參數(shù)都是值傳遞。
    ??? ?? ??? ??? 當(dāng)沒有值返回時(shí),返回類型必須被定義為void。?
    ??? ??? ??? 返回類型必須與方法名相鄰,其他修飾符可以調(diào)換位置。
    ??? ??? ??? ?
    ??? ??? 構(gòu)造器:
    ??? ??? ??? 在創(chuàng)建對(duì)象的過程中調(diào)用的方法。
    ??? ??? ??? 構(gòu)造器沒有返回類型。
    ??? ??? ??? 構(gòu)造器的名字與類名相同。
    ??? ??? ??? 格式為:[ 修飾符 ]? 類名( 參數(shù)列表 ){? },修飾符可以是private、 protected、 default、private
    ??? ??? ??? 在一個(gè)對(duì)象的生成周期中構(gòu)造器只用一次,由系統(tǒng)自動(dòng)調(diào)用,不允許手工調(diào)用。
    ??? ??? ??? 程序員沒有提供一個(gè)構(gòu)造器,系統(tǒng)會(huì)自動(dòng)提供一個(gè)無參的構(gòu)造器。
    ??? ??? ??? 獲得對(duì)象的方式:
    ??? ??? ??? ??? 通過new(在堆空間中申請(qǐng)分配空間),new 類名(),可以通過這種形式或的一個(gè)對(duì)象,這時(shí)的對(duì)象是無法使用,必須把他的地址存放進(jìn)一個(gè)對(duì)象變量才能夠使用。
    ??? ??? ??? ??? 例如 :
    ??? ??? ??? ??? ??? Car c=new Car();
    ??? ??? ??? 注意:
    ??? ??? ??? ??? 最好在寫類時(shí)提供一個(gè)無參的構(gòu)造器。
    ??? ??? ??? ??? ??? ??? ?
    ??? ??? this關(guān)鍵字:
    ??? ??? ??? this是個(gè)隱式參數(shù),代表當(dāng)前對(duì)象;
    ??? ??? ??? ??? publie class Student{
    ??? ??? ??? ??? ??? private String name;
    ??? ??? ??? ??? ??? public void setName(String name){
    ??? ??? ??? ??? ??? ??? this.name=name;??? ??? //this.name為當(dāng)前對(duì)象的成員變量
    ??? ??? ??? ??? ??? }
    ??? ??? ??? ??? }
    ??? ??? ??? ??? ?
    ??? ??? ??? 如果某個(gè)構(gòu)造方法的第一個(gè)語(yǔ)句具有形式this( ··· ),那么這個(gè)構(gòu)造方法將調(diào)用同一類中的其他構(gòu)造方法。
    ??? ??? ??? ?
    ??????? ??? ??? 注意:
    ??????? ??? ??? ??? 在構(gòu)造器中this(...)必須放在該構(gòu)造器的第一行。
    ??? ??? ??? ??? this不能出現(xiàn)在靜態(tài)方法里面??? ??? ?
    ??? ?
    ??? 類、對(duì)象、實(shí)例三者的關(guān)系:
    ??? ??? 類:是對(duì)象的模板,可以實(shí)例化對(duì)象
    ??? ??? 對(duì)象:類的個(gè)體
    ??? ??? 實(shí)例:實(shí)現(xiàn)的對(duì)象
    ??? ??? student s;??? ?
    ??? ??? s=new student();
    ??? ??? ??? 其中 Student為類,s為對(duì)象,new Student()為實(shí)例,s賦值后也是實(shí)例了。
    ?
    方法重載:
    ??? 方法名相同,參數(shù)表不同,不考慮返回值類型(但最好還是使返回類型一致)。
    ??? 編譯器根據(jù)參數(shù),選擇一個(gè)方法,如果沒有完全匹配的,對(duì)于參數(shù)表采用“向上就近匹配原則”,但不允許模棱兩可。
    ??? 方法重載屏蔽了一個(gè)對(duì)象的同一類方法由于參數(shù)不同所造成的差異。
    ??? ??? ??? ?
    封裝:
    ??? 類的屬性加private修飾符,來限制只能夠在類的內(nèi)部進(jìn)行訪問,有效的保護(hù)數(shù)據(jù)。
    ??? 對(duì)于類中的私有屬性,要對(duì)其給出一對(duì)方法getXxx(),setXxx()訪問私有屬性,保證對(duì)私有屬性的操作的安全性。
    ??? 方法公開的是方法的聲明,即只須知道參數(shù)和返回值就可以調(diào)用該方法,隱藏方法的實(shí)現(xiàn)的細(xì)節(jié)。
    ??? 一個(gè)對(duì)象和外界的聯(lián)系應(yīng)當(dāng)通過一個(gè)統(tǒng)一的接口,應(yīng)當(dāng)公開的公開,應(yīng)當(dāng)隱藏的隱藏。
    ??? ??? ?
    繼承:
    ??? 父類到子類是從一般到特殊的關(guān)系。
    ??? ??? 泛化:將不同子類中的共性抽象成父類的過程。
    ??? ??? 特化:在原有父類的基礎(chǔ)上加入一些個(gè)性的過程。
    ??? ??? 原則:父類放共性,子類放個(gè)性。
    ??? 繼承的關(guān)鍵字:extends
    ??? Java只支持單繼承:一個(gè)類最多只有一個(gè)直接的父類。
    ?
    ???? ??? 方法覆蓋:
    ??? ??? 方法名:相同
    ??? ??? 參數(shù)表:相同
    ??? ??? 訪問限制符:相同或者更寬
    ??? ??? 返回值類型:相同或者子類返回的類型是父類返回的類型的子類(在JDK5.0以后)
    ??? ??? 拋出的異常:不能比父類更寬。
    ?????
    ???? ??? super關(guān)鍵字:
    ??? ??? super()表示調(diào)用父類的構(gòu)造器
    ??? ??? super()也和this()一樣必須放在方法的第一句
    ??? ??? super()和this()不能同時(shí)出現(xiàn)?????????
    ??? ??? super可以屏蔽子類屬性和父類屬性重名時(shí)帶來的屬性遮蓋,super. 表示調(diào)用父類的方法或?qū)傩?
    ??? ??? 在子類的構(gòu)造器中如果沒有指定調(diào)用父類的哪一個(gè)構(gòu)造器,那么就會(huì)調(diào)用父類的無參構(gòu)造器,即super()
    ??? ??? ?
    ??? 注意:
    ??? ??? 父類的構(gòu)造器不能被子類繼承
    ??? ??? 方法和屬性可以被繼承,權(quán)限不限制能否繼承過來,限制的是能否直接訪問
    ??? ??? 先構(gòu)造父類,后構(gòu)造子類,先this后super
    ??? ??? ?
    多態(tài):
    ??? 多態(tài)分為兩種:編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)。
    ??? ??? 編譯時(shí)類型:主觀概念,把它看作什么。
    ??? ??? 運(yùn)行時(shí)類型:客觀概念,實(shí)際它是什么。
    ??? ? ??? 例:Animal a=new Dog();
    ??? ????? ??? ??? 指著狗問,這個(gè)動(dòng)物是什么?
    ??? ????? ??? ??? ?
    ???? ??? 運(yùn)行時(shí)多態(tài)的三原則:
    ??? ??? 對(duì)象類型不變。
    ??? ??? 只能對(duì)對(duì)象調(diào)用編譯時(shí)類型中定義的方法。
    ??? ??? 在程序的運(yùn)行時(shí),根據(jù)對(duì)象的運(yùn)行時(shí)類型,找覆蓋后的方法來調(diào)用。(運(yùn)行時(shí)動(dòng)態(tài)類型綁定)
    ??? ??? ?
    ???? ??? 強(qiáng)制類型轉(zhuǎn)換: 一定沒有新對(duì)象生成。(父類的引用賦值給子類的引用需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換)
    ???? ??? 關(guān)鍵字:instanceof
    ????????? ??? 用法:引用? instanceof? 類名??? 判斷這個(gè)引用所指向的對(duì)象是否屬于這個(gè)類。
    ??? ? ??? 用在強(qiáng)制轉(zhuǎn)換之前,避免類型轉(zhuǎn)換異常。
    ??? ??? ??? if(a instanceof Dog){
    ??? ??? ??? ??? Dog d=(Dog)a;
    ??? ??? ??? }
    ??? ??? ??? ?
    ??? 多態(tài)的作用:把不同的子類對(duì)象都當(dāng)作父類來看,可以屏蔽不同子類對(duì)象之間的差異,寫出通用的代碼,做出通用的編程,以適應(yīng)需求的不斷變化。


    修飾符static: 把對(duì)象相關(guān)的變成類相關(guān)的,它可以修飾屬性、方法、代碼塊和內(nèi)部類
    ??? static修飾屬性(類變量):
    ??? ??? 那么這個(gè)屬性就可以用" 類名.屬性名 "來訪問,也就是使這個(gè)屬性成為本類的類變量,為本類對(duì)象所共享。
    ??? ??? 類加載的過程,類本身也是保存在文件中(字節(jié)碼文件保存著類的信息)的,java會(huì)通過I/O流把類的文件讀入JVM(java虛擬機(jī)),這個(gè)過程稱為類的加載。JVM會(huì)通過類路徑(CLASSPATH)來找字節(jié)碼文件。需要的時(shí)候才會(huì)進(jìn)行類加載,生成對(duì)象時(shí)是先加載后構(gòu)造
    ??? ??? 類變量,會(huì)在加載時(shí)自動(dòng)初始化,初始化規(guī)則和實(shí)例變量相同。
    ??? ??? 注意:
    ??? ??? ??? 類中的實(shí)例變量是在創(chuàng)建對(duì)象時(shí)被初始化的
    ??? ??? ??? static修飾的屬性,是在類加載時(shí)被創(chuàng)建并進(jìn)行初始化,類加載的過程只進(jìn)行一次,也就是類變量只會(huì)被創(chuàng)建一次。
    ??? ??? ??? ?
    ??? static修飾方法(靜態(tài)方法):
    ??? ??? 會(huì)使這個(gè)方法成為整個(gè)類所公有的方法,可以用" 類名.方法名 "訪問。
    ??? ??? static修飾的方法,不能直接訪問本類中的非靜態(tài)成員,但本類的非靜態(tài)方法可以訪問本類的靜態(tài)成員。
    ??? ??? 在靜態(tài)方法中不能出現(xiàn)this關(guān)鍵字。
    ??? ??? 父類中是靜態(tài)方法,子類中不能覆蓋為非靜態(tài)方法,在符合覆蓋規(guī)則的前提下,在父子類中,父類中的靜態(tài)方法可以被子類中的靜態(tài)方法覆蓋,但是沒有多態(tài)。(在使用對(duì)象調(diào)用靜態(tài)方法時(shí)其實(shí)是調(diào)用編譯時(shí)類型的靜態(tài)方法)
    ??? ??? java中的main方法必須寫成static的原因:在類加載時(shí)無法創(chuàng)建對(duì)象,而靜態(tài)方法可以不通過對(duì)象調(diào)用,所以在類加載時(shí)就可以通過main方法入口來運(yùn)行程序。
    ??? ??? ?
    ??? static修飾初始代碼塊:
    ??? ??? 這時(shí)這個(gè)初始代碼塊就叫做靜態(tài)初始代碼塊,這個(gè)代碼塊只在類加載時(shí)被執(zhí)行一次。
    ??? ??? 可以用靜態(tài)初始代碼塊初始化一個(gè)類。
    ??? ??? 動(dòng)態(tài)初始代碼塊,寫在類體中的“{}”,這個(gè)代碼塊是在生成對(duì)象時(shí)運(yùn)行,這種代碼塊叫動(dòng)態(tài)初始代碼塊。
    ??? ??? ?
    單例設(shè)計(jì)模式:
    ??? 一個(gè)類只允許有一個(gè)對(duì)象,保證所有引用的對(duì)象都是同一個(gè)對(duì)象。
    ??? 因?yàn)橹辉试S存在一個(gè)對(duì)象,則不允許在外面直接new出新的對(duì)象,所以應(yīng)該把構(gòu)造器設(shè)為private,。
    ??? 在類內(nèi)定義一個(gè)公開的靜態(tài)方法,讓使用者進(jìn)行調(diào)用,通過該方法去獲得一個(gè)實(shí)例。
    ??? 例:
    ??? ??? public calss Singleton{
    ??? ??? ??? private static Singleton s;
    ??? ??? ??? private Singleton(){}
    ??? ??? ??? public static Singleton newInstance(){
    ??? ??? ??? ??? if ( s == null)
    ??? ??? ??? ??? ??? s = new Singleton();
    ??? ??? ??? ??? return s;
    ??? ??? ??? }
    ??? ??? }??? ?
    ??? ??? ?
    修飾符final:不允許改變,可以修飾變量、方法、類
    ??? final修飾變量:
    ??? ??? 被fianl修飾的變量就會(huì)變成常量,一旦賦值不能改變
    ??? ??? 常量可以在初始化時(shí)直接賦值,也可以在構(gòu)造方法里賦值,只能在這兩種方法里二選一,不能不為常量賦值
    ??? ??? 常量不會(huì)有默認(rèn)初始值
    ??? ??? 鎖定棧,使棧中的數(shù)據(jù)不可以改變
    ??? ??? 靜態(tài)常量只能在初始化時(shí)直接賦值
    ??? ??? ?
    ??? final修飾方法:
    ??? ??? 被final修飾的方法將不能被其子類覆蓋,保持方法的穩(wěn)定不能被覆蓋
    ??? ?
    ??? final修飾類:
    ??? ??? 被final修飾的類將不能被繼承
    ??? ??? final類中的方法也都是final的
    ??? ?
    ??? 注意:
    ??? ??? final不能用來修飾構(gòu)造方法
    ??? ??? ?
    訪問權(quán)限控制:??? ?
    ??? private:
    ??? ??? 本類內(nèi)部可以訪問
    ??? ??? 不能繼承到子類
    ??? default:
    ??? ??? 本類內(nèi)部可以訪問,同包其他類也可以訪問。
    ??? ??? 同包可繼承
    ??? protected:
    ??? ??? 本類內(nèi)部可以訪問,不同包的子類也可以訪問,同包其他類也可以訪問。
    ??? ??? 能繼承到子類
    ??? public:
    ??? ??? 任何地方都可以訪問??
    ??? ??? 能繼承到子類

    修飾符abstract:抽象的,定義框架不去實(shí)現(xiàn),可以修飾類和方法
    ??? abstract修飾類:
    ??? ??? 會(huì)使這個(gè)類成為一個(gè)抽象類,這個(gè)類將不能生成對(duì)象實(shí)例,但可以做為對(duì)象變量聲明的類型,也就是編譯時(shí)類型
    ??? ??? 抽象類就相當(dāng)于一個(gè)類的半成品,需要子類繼承并覆蓋其中的抽象方法,這時(shí)子類才又創(chuàng)建實(shí)例的能力,如果子類沒有實(shí)現(xiàn)父類的抽象方法,那么子類也要為抽象類。
    ??? ?
    ??? abstract修飾方法:
    ??? ??? 會(huì)使這個(gè)方法變成抽象方法,也就是只有聲明而沒有實(shí)現(xiàn),實(shí)現(xiàn)部分以";"代替,需要子類繼承實(shí)現(xiàn)。
    ??? ??? 抽象方法代表了某種標(biāo)準(zhǔn),定義標(biāo)準(zhǔn),定義功能,在子類中去實(shí)現(xiàn)功能(子類繼承了父類并需要給出從父類繼承的抽象方法的實(shí)現(xiàn))。
    ??? ??? 方法一時(shí)間想不到怎么被實(shí)現(xiàn),或有意要子類去實(shí)現(xiàn)而定義某種標(biāo)準(zhǔn),這個(gè)方法可以被定義為抽象。
    ??? ?
    ??? 注意:
    ??? ??? 有抽象方法的類一定是抽象類。但是抽象類中不一定都是抽象方法,也可以全是具體方法。
    ?
    接口(interface):
    ??? 接口的定義:接口從本質(zhì)上說是一種特殊的抽象類。
    ??? ??? 關(guān)鍵字interface。
    ??? ??? 在接口中,所有的方法為公開、抽象的方法:public abstract
    ??? ??? 在接口中,所有的屬性都是公開、靜態(tài)的常量:public static final
    ??? ??? 接口與接口之間可以多繼承,用extends,多個(gè)之間用逗號(hào)隔開。
    ??? ??? 接口中沒有構(gòu)造方法,不能用“new 接口名”來實(shí)例化一個(gè)接口,但可以聲明一個(gè)接口。
    ??? ?
    ??? 接口的實(shí)現(xiàn):
    ??? ??? 關(guān)鍵字implements
    ??? ??? 一個(gè)類實(shí)現(xiàn)一個(gè)接口必須實(shí)現(xiàn)接口中所有的方法,否則其為抽象類,并且在實(shí)現(xiàn)類中的方法要加上public(不能省略)。
    ??? ??? ??? 類中的默認(rèn)修飾符:default。
    ??? ??? ??? 接口中的默認(rèn)修飾符:public。
    ??? ??? 一個(gè)類除了繼承另一個(gè)類外(只能繼承一個(gè)類),還可以實(shí)現(xiàn)多個(gè)接口(接口之間用逗號(hào)分隔)。
    ?
    ??? 接口的作用:
    ??? ??? 間接實(shí)現(xiàn)多繼承:用接口來實(shí)現(xiàn)多繼承并不會(huì)增加類關(guān)系的復(fù)雜度。因?yàn)榻涌诓皇穷悾c類不在一個(gè)層次上,是在類的基礎(chǔ)上進(jìn)行再次抽象。
    ??? ??? 接口可以抽象出次要類型,分出主、次關(guān)系類型,符合看世界的一般方法。
    ??? ??? 接口隔離,與封裝性有關(guān)。一個(gè)對(duì)象都有多個(gè)方面,可以只展示其中幾個(gè)方面,其他的都隱藏。因此可以看為“更高層次的封裝”,把??? ??? ??? 一個(gè)大接口做成若干個(gè)小接口。
    ??? ??? 通過接口制定標(biāo)準(zhǔn)(最重要的作用)
    ??? ??? ??? 接口:制定標(biāo)準(zhǔn)。
    ??? ??? ??? 接口的調(diào)用者:使用標(biāo)準(zhǔn)。
    ??? ??? ??? 接口的實(shí)現(xiàn)類:實(shí)現(xiàn)標(biāo)準(zhǔn)。
    ??? ??? ??? ??? 解耦合作用:把使用標(biāo)準(zhǔn)和實(shí)現(xiàn)標(biāo)準(zhǔn)分開,使得標(biāo)準(zhǔn)的制定者和實(shí)現(xiàn)者解除偶合關(guān)系,具有極強(qiáng)的可移植性
    ??? ??? ??? ??? 例:sun公司提供一套訪問數(shù)據(jù)庫(kù)的接口(標(biāo)準(zhǔn)),java程序員訪問數(shù)據(jù)庫(kù)時(shí)針對(duì)數(shù)據(jù)庫(kù)接口編程。接口由各個(gè)數(shù)據(jù)庫(kù)廠商負(fù)責(zé)實(shí)現(xiàn)。
    ??? ??? ?????
    ??? 接口編程的原則
    ??? ??? 盡量針對(duì)接口編程(能用接口就盡量用接口)
    ??? ??? 接口隔離原則(用若干個(gè)小接口取代一個(gè)大接口)
    ??? ??? ?
    ??? 注意:
    ??? ??? 接口中沒有構(gòu)造器,也沒有main方法
    ??? ??? ?
    封裝類:
    ??? Java為每一個(gè)簡(jiǎn)單數(shù)據(jù)類型提供了一個(gè)封裝類。
    ??? 除int和char,其余類型首字母大寫即成封裝類。
    ??? ??? int??????????????? Integer
    ??? ??? char???????????? Character
    ??? 最常用的兩個(gè)封裝類Integer和Double
    ??? jdk1.4之前基本類型和封裝類的轉(zhuǎn)化是需要構(gòu)造器去轉(zhuǎn)化的,到了jdk1.5是自動(dòng)進(jìn)行轉(zhuǎn)化的
    ??? int、Integer和String之間的轉(zhuǎn)化(最常用的)
    ??? ??? int i=1;
    ??? ??? Integer in = new Integer(i);??? ??? ??? ??? //int --> Integer?
    ??? ??? int? i = in.intValue();??? ??? ??? ??? ??? //Integer --> int?
    ??? ??? String? str = String.valueOf(i);??? ??? ??? //Int --> String
    ??? ??? int? ii = Integer.parseInt(str);??? ??? ??? //String --> int
    ??? ??? String? s = in.toString();??? ??? ??? ??? ??? //Integer --> String
    ??? ??? Integer inte = Integer.valueOf(str);??? ??? //String --> Integer??????
    ?
    Object類
    ??? hashCode():
    ??? ??? 返回該對(duì)象的哈希碼值
    ??? ??? hashCode 的常規(guī)協(xié)定是:?
    ??? ??? ??? 在 Java 應(yīng)用程序執(zhí)行期間,在同一對(duì)象上多次調(diào)用 hashCode 方法時(shí),必須一致地返回相同的整數(shù),前提是對(duì)象上 equals 比較中所用的信息沒有被修改。
    ??? ??? ??? 如果根據(jù) equals(Object) 方法,兩個(gè)對(duì)象是相等的,那么在兩個(gè)對(duì)象中的每個(gè)對(duì)象上調(diào)用 hashCode 方法都必須生成相同的整數(shù)結(jié)果。?
    ??? ??? ??? ?
    ??? toString():
    ??? ??? 返回該對(duì)象的字符串表示。
    ??? ??? 通常,toString 方法會(huì)返回一個(gè)“以文本方式表示”此對(duì)象的字符串。結(jié)果應(yīng)是一個(gè)簡(jiǎn)明但易于讀懂。建議所有子類都重寫此方法。
    ??? ??? ?
    ??? equals()
    ??? ??? 指示某個(gè)其他對(duì)象是否與此對(duì)象“相等”。?
    ??? ??? equals 方法在非空對(duì)象引用上實(shí)現(xiàn)相等關(guān)系:?
    ??? ??? ??? 自反性:對(duì)于任何非空引用值 x,x.equals(x) 都應(yīng)返回 true。?
    ??? ??? ??? 對(duì)稱性:對(duì)于任何非空引用值 x 和 y,當(dāng)且僅當(dāng) y.equals(x) 返回 true 時(shí),x.equals(y) 才應(yīng)返回 true。?
    ??? ??? ??? 傳遞性:對(duì)于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 應(yīng)返回 true。?
    ??? ??? ??? 一致性:對(duì)于任何非空引用值 x 和 y,多次調(diào)用 x.equals(y)始終返回 true 或始終返回 false,前提是對(duì)象上 equals 比較中所用的信息沒有被修改。對(duì)于任何非空引用值 x,x.equals(null) 都應(yīng)返回 false。?
    ??? ??? ??? 注意:
    ??? ??? ??? ??? 當(dāng)此方法被重寫時(shí),通常有必要重寫 hashCode 方法,以維護(hù) hashCode 方法的常規(guī)協(xié)定,該協(xié)定聲明相等對(duì)象必須具有相等的哈希碼。?
    ?
    String、StringBuffer和StringBulder??? ?
    ??? String: 不可改變的Unicode字符序列
    ??? ??? 池化思想,把需要共享的數(shù)據(jù)放在池中,用一個(gè)存儲(chǔ)區(qū)域來存放一些公用資源以減少存儲(chǔ)空間的開銷。
    ??? ??? 在String類中,以字面值創(chuàng)建時(shí),會(huì)到Java方法空間的串池中去查找,如果沒有則會(huì)在串池里創(chuàng)建一個(gè)字符串對(duì)象,并返回其地址賦給對(duì)象變量,如果有就返回串池中字符串的地址,并把這個(gè)地址賦給對(duì)象變量。
    ??? ??? 如果是new,則會(huì)在堆空間中創(chuàng)建String類的對(duì)象,不會(huì)有上述的過程
    ??? ??? 如:
    ??? ??? ??? String s1 = "abc";??????????? //新創(chuàng)建,字符串常量池中沒有該串,則會(huì)在池中創(chuàng)建一個(gè)串"abc"
    ??? ??? ??? String s2 = "abc";??????????? //串池中已經(jīng)存在"abc",則s2會(huì)去指向"abc"而不會(huì)去創(chuàng)建一個(gè)新的
    ??? ??? ??? String s3 = new String("abc");?????????? //直接在堆中去開辟一個(gè)新的空間,而不會(huì)去池中查找
    ??? ??? 類中的具體方法查看下Api文檔。
    ??? ??? 調(diào)用任何String中的方法,不會(huì)改變String自身,除非重新賦值。
    ??? ??? ??? ?
    ??? StringBuffer: 可改變的Unicode字符序列
    ??? ??? 允許并發(fā)操作,是線程安全的
    ??? ??? String類在進(jìn)行字符串連接時(shí)會(huì)顯得效率很低,就是因?yàn)樗a(chǎn)生的對(duì)象的屬性是不能夠修改的,當(dāng)連接字符串時(shí)也就只能創(chuàng)建新的對(duì)象。
    ??? ??? 對(duì)于很多字符串連接時(shí),應(yīng)當(dāng)使用StringBuffer類,使用這個(gè)類的對(duì)象來進(jìn)行字符串連接時(shí)就不會(huì)有多余的中間對(duì)象生成,從而優(yōu)化了效率。
    ??? ??? 例:對(duì)于字符串連接String str = "A" + "B" + "C" + "D";
    ??? ??? ??? 產(chǎn)生:"AB"、"ABC"、"ABCD"
    ??? ??? ??? 在串池中產(chǎn)生的"AB"、"ABC"明顯是多余對(duì)象,浪費(fèi)空間。
    ??????????????????? ??? 解決方案:
    ??? ??? ??? ??? String s = null;
    ??? ??? ??? ??? StringBuffer sb = new StringBuffer("A");
    ??? ??? ??? ??? sb.append("B");
    ??? ??? ??? ??? sb.append("C");
    ??? ??? ??? ??? sb.append("D");
    ??? ??? ??? ??? s = sb.toString();
    ??? ??? ??? ??? ??? ?
    ??? StringBulder: 可改變的Unicode字符序列
    ??? ??? 操作同StringBuffer,只是不支持并發(fā)操作,非線程安全的

    集合:保存多個(gè)其他對(duì)象的對(duì)象,不能保存簡(jiǎn)單類型
    ??? List:有序(存放元素的順序),可重復(fù)的集合
    ??? ??? ArrayList:實(shí)質(zhì)就是一個(gè)會(huì)自動(dòng)增長(zhǎng)的數(shù)組
    ??? ??? ??? 查詢效率比較高,增刪的效率比較低,適用于查詢比較頻繁,增刪動(dòng)作較少的元素管理的集合。
    ??? ??? ??? 加載大批量的數(shù)據(jù)時(shí),先進(jìn)行手動(dòng)擴(kuò)容(就是調(diào)用ensureCapacity(int minCapacity)方法),這樣可以提高效率。
    ??? ??? ??? ?
    ??? ??? LinkedList:底層是用雙向循環(huán)鏈表來實(shí)現(xiàn)的
    ??? ??? ??? 查詢效率低,但是增刪效率很高,適用于增刪動(dòng)作的比較頻繁,查詢次數(shù)較少的元素管理的集合
    ?
    ??? Set:無序的,不允許有重復(fù)元素的集合
    ??? ??? HashSet:
    ??? ??? ??? Object類中的hashCode()的方法是所有類都會(huì)繼承的方法,這個(gè)方法會(huì)算出一個(gè)Hash碼值返回,HashSet會(huì)用Hash碼值去和數(shù)組長(zhǎng)度取模,對(duì)象的模值(這個(gè)模值就是對(duì)象要存放在數(shù)組中的位置,和數(shù)組的下標(biāo)相同)相同時(shí)才會(huì)判斷數(shù)組中的元素和要加入的對(duì)象的內(nèi)容是否相同,如果不同才會(huì)再找位置添加進(jìn)去,相同則不允許添加。
    ??? ??? ??? 如果數(shù)組中的元素和要加入的對(duì)象的hashCode()返回了相同的Hash碼值,才會(huì)用equals()方法來判斷兩個(gè)對(duì)象的內(nèi)容是否相同。??? ?
    ??? ??? ??? 注意:要存入HashSet的集合對(duì)象中的自定義類必須覆蓋hashCode()、equals()兩個(gè)方法,才能保證集合中元素不重復(fù)。
    ??? ??? ??? ?
    ??? ??? TreeSet:可排序的Set
    ??? ??? ??? SortedSet接口是Set的子接口,TreeSet是SortedSet接口的實(shí)現(xiàn)類,他可以對(duì)集合中的元素進(jìn)行排序。
    ??? ??? ??? ?
    ??? ??? ??? 將自定義類的對(duì)象存放在TreeSet中,這個(gè)類需要實(shí)現(xiàn)了Comparable接口,TreeSet可以自動(dòng)過濾掉重復(fù)元素所以不在需要重載hashCode()方法,TreeSet會(huì)根據(jù)比較規(guī)則判斷元素內(nèi)容是否相同,不同則會(huì)存入,TreeSet會(huì)在元素存入時(shí)就進(jìn)行排序。
    ??? ??? ??? ?
    ??? ??? ??? Comparable接口:
    ??? ??? ??? ??? 也叫做可比較接口,這個(gè)接口在java.lang包下,只要根據(jù)指定類型的排序規(guī)則實(shí)現(xiàn)了這個(gè)接口,就是可排序的。
    ??? ??? ??? ??? 這個(gè)接口中只定義了一個(gè) compareTo(Object o) 方法,該方法的返回值類型是整型,如果當(dāng)前對(duì)象大于參數(shù)對(duì)象就返回正數(shù),當(dāng)前對(duì)象等于參數(shù)對(duì)象就返回0,當(dāng)前對(duì)象小于參數(shù)對(duì)象就返回負(fù)值,這樣寫就是升序排列,反之則是進(jìn)行降序排列。
    ??? ??? ??? ??? ?
    ??? ??? ??? Comparator接口:
    ??? ??? ??? ??? 比較器Comparator接口,是另一種對(duì)自定義類型對(duì)象的集合整體排序的方法,存在于java.util包下。
    ??? ??? ??? ??? 這個(gè)接口中定義了一個(gè) compare(Object o1,Object o2) 方法來比較兩個(gè)對(duì)象,這個(gè)方法的返回值定義和上面介紹的那個(gè)方法是一樣。
    ??? ??? ??? ??? 利用這種方式,則在創(chuàng)建集合的時(shí)候把定義好的比較器作為參數(shù),構(gòu)造一個(gè)集合
    ??? ??? ??? ??? ?
    ??? Map:存放key-value對(duì)(有關(guān)系的兩個(gè)對(duì)象,一個(gè)做key,一個(gè)做value,同時(shí)存入)
    ??? ??? HashMap:基于哈希表的 Map 接口的實(shí)現(xiàn),此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用 null 值和 null 鍵
    ??? ??? ??? 遍歷:
    ??? ??? ??? ??? 先調(diào)用keySet()得到key的set集合,
    ??? ??? ??? ??? 再迭代遍歷key的set集合,
    ??? ??? ??? ??? 根據(jù)key得到value。
    ??? ??? ??? ??? ?
    ??? ??? Hashtable:同HashMap,一般不使用
    ??? ??? ?
    ??? ??? HashMap與Hashtable的區(qū)別:
    ??? ??? ??? HashMap:非線程安全,不支持并發(fā)控制,允許空的鍵值對(duì)。
    ??? ??? ??? Hashtable:是線程安全,支持并發(fā)控制,不允許有空的鍵值對(duì)。
    ??? ??? ??? ?
    ??? ??? SortedMap接口:Map的子接口,按某一特定排序規(guī)則來存放所加入的鍵值對(duì)
    ??? ??? ??? 實(shí)現(xiàn)類:TreeMap類。
    ??? ??? ??? ??? Key值的排序規(guī)則,同SortedSet接口實(shí)現(xiàn)類TreeSet
    ??? ??? ??? ??? ?
    ??? ??? 注意:
    ??? ??? ??? key一般是8種基本類型的封裝類或者是String類,拿自己自定義的類作為Key沒有意義。
    ??? ??? ??? key不可重復(fù),value可以重復(fù)
    ??? ??? ????

    反射:
    ??? 反射:在運(yùn)行時(shí)動(dòng)態(tài)分析或使用一個(gè)類進(jìn)行工作。
    ??? java.lang.Class類:描述類信息的類。
    ??? 類對(duì)象:描述一個(gè)類信息的對(duì)象,當(dāng)虛擬機(jī)加載類的時(shí)候,就會(huì)創(chuàng)建這個(gè)類的類對(duì)象并加載該對(duì)象,Class是類對(duì)象的類型。
    ??? ?
    ??? 獲得類對(duì)象的方式:
    ??? ??? 用" 類名.class "獲得這個(gè)類的類對(duì)象。
    ??? ??? 用類的對(duì)象掉用getClass(),如object.getClass()得到這個(gè)對(duì)象的類型的類對(duì)象。
    ??? ??? 可以使用Class.forName(類名),也可以得到這個(gè)類的類對(duì)象,(注意,這里寫的類名必須是全限定名(全名),是包名加類名,XXX.XXX.XXXX)。
    ??? ??? 基本類型也有類對(duì)象,用" 封裝類.TYPE "可以獲得對(duì)應(yīng)的基本類型的類對(duì)象。
    ?
    ??? java.lang.reflect包下的三個(gè)重要類:
    ??? ??? Field屬性類:用來描述屬性的信息。
    ??? ??? Method方法類:方法的信息的描述。
    ??? ??? Constructor構(gòu)造方法類:用來描述構(gòu)造方法的信息。
    ?
    ??? Class類中的常用方法:
    ??? ??? newInstance()?
    ??? ??? ??? 創(chuàng)建此 Class 對(duì)象所表示的類的一個(gè)新實(shí)例(調(diào)用無參構(gòu)造創(chuàng)建的對(duì)象)。
    ??? ??? getDeclaredMethods()
    ??? ??? ??? 獲得的是一個(gè)Method方法類對(duì)象的數(shù)組,獲得本類(不包括父類)聲明的所有(包括private的)方法對(duì)象。
    ??? ??? getMethods()???? //推薦使用
    ??? ??? ??? 獲得的是一個(gè)Method方法類對(duì)象的數(shù)組,獲得所有(父類的也包括)publice的方法對(duì)象。
    ??? ??? getDeclaredConstructors()
    ??? ??? ??? 獲得的是一個(gè)Constructor構(gòu)造方法類對(duì)象的數(shù)組,獲得這個(gè)類聲明的所有構(gòu)造方法對(duì)象。
    ??? ??? getConstructors()??? //推薦使用
    ??? ??? ??? 獲得的是一個(gè)Constructor構(gòu)造方法類對(duì)象的數(shù)組,獲得所有publice的構(gòu)造方法對(duì)象。
    ??? ??? getDeclaredFields()??? //推薦使用
    ??? ??? ??? 獲得的是一個(gè)Field屬性類對(duì)象的數(shù)組,獲得本類聲明的所有屬性的屬性對(duì)象。
    ??? ??? getFields()
    ??? ??? ??? 獲得的是一個(gè)Field屬性類對(duì)象的數(shù)組,獲得所有publice的屬性對(duì)象。
    ??? ??? ??? ?
    ??? 使用反射構(gòu)造一個(gè)類的對(duì)象的步驟:
    ??? ??? a. 獲得類對(duì)象
    ??? ??? b. 獲得構(gòu)造方法對(duì)象
    ??? ??? c. 獲得對(duì)象,用構(gòu)造方法對(duì)象調(diào)用構(gòu)造方法,如果使用無參構(gòu)造方法,可以跳過第二步,直接使用" 類對(duì)象.newInstance() "方法來獲得這個(gè)類的對(duì)象
    ??? ??? d. 獲得方法對(duì)象
    ??? ??? e. 用方法對(duì)象調(diào)用方法(用這個(gè)類的對(duì)象作為第一參數(shù))
    ??? ??? 如下面的例子:
    ??? ??? ??? 反射機(jī)制的實(shí)現(xiàn)類:
    ??? ??? ??? ??? package day07.reflect;??? ??? ??? ??? ?
    ??? ??? ??? ??? import java.lang.reflect.Field;
    ??? ??? ??? ??? import java.lang.reflect.Method;
    ??? ??? ??? ??? import java.util.HashMap;
    ??? ??? ??? ??? import java.util.Map;
    ??? ??? ??? ??? import java.util.Set;??? ??? ??? ?
    ??? ??? ??? ??? public class TestReflect {??? ??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? public static Object get(String className , Map<String,Object> map) throws Exception{
    ??? ??? ??? ??? ??? ??? Class c = Class.forName(className);????????????????? //獲得類對(duì)象
    ??? ??? ??? ??? ??? ??? Object o = c.newInstance();?????????????????? //獲得對(duì)象
    ??? ??? ??? ??? ??? ??? Set<String> set = map.keySet();
    ??? ??? ??? ??? ??? ??? for(String str : set){
    ??? ??? ??? ??? ??? ??? ??? String s = "set" + str.substring(0,1).toUpperCase()+str.substring(1);
    ??? ??? ??? ??? ??? ??? ??? Field f = c.getDeclaredField(str);
    ??? ??? ??? ??? ??? ??? ??? Method m = c.getMethod(s, f.getType());??????? //獲得方法對(duì)象
    ??? ??? ??? ??? ??? ??? ??? m.invoke(o, map.get(str));?????????????????????? //用方法對(duì)象調(diào)用方法
    ??? ??? ??? ??? ??? ??? }
    ??? ??? ??? ??? ??? ??? return o;
    ??? ??? ??? ??? ??? }
    ??? ??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? public static void main(String[] args) throws Exception {??? ?
    ??? ??? ??? ??? ??? ??? Map m = new HashMap();
    ??? ??? ??? ??? ??? ??? m.put("name", "zhang");
    ??? ??? ??? ??? ??? ??? m.put("age", 22);
    ??? ??? ??? ??? ??? ??? Object o = get("day07.reflect.Student",m);
    ??? ??? ??? ??? ??? ??? Student s = (Student) o;
    ??? ??? ??? ??? ??? ??? System.out.println(s.getName() + "?? " + s.getAge());
    ??? ??? ??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? ??? Map m1 = new HashMap();
    ??? ??? ??? ??? ??? ??? m1.put("name", "li");
    ??? ??? ??? ??? ??? ??? m1.put("gender", "男");
    ??? ??? ??? ??? ??? ??? Object o1 = get("day07.reflect.Teacher",m1);
    ??? ??? ??? ??? ??? ??? Teacher t = (Teacher) o1;
    ??? ??? ??? ??? ??? ??? System.out.println(t.getName() + "??? " + t.getGender());
    ??? ??? ??? ??? ??? }
    ??? ??? ??? ??? }
    ??? ??? ??? 學(xué)生類:
    ??? ??? ??? ??? package day07.reflect;??? ??? ??? ??? ?
    ??? ??? ??? ??? public class Student {
    ??? ??? ??? ??? ??? private String name;??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? private int age;??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? public int getAge() {
    ??? ??? ??? ??? ??? ??? return age;
    ??? ??? ??? ??? ??? }??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? public void setAge(int age) {
    ??? ??? ??? ??? ??? ??? this.age = age;
    ??? ??? ??? ??? ??? }??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? public String getName() {
    ??? ??? ??? ??? ??? ??? return name;
    ??? ??? ??? ??? ??? }??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? public void setName(String name) {
    ??? ??? ??? ??? ??? ??? this.name = name;
    ??? ??? ??? ??? ??? }
    ??? ??? ??? ??? }??? ?
    ??? ??? ??? 教師類:
    ??? ??? ??? ??? package day07.reflect;??? ??? ??? ??? ?
    ??? ??? ??? ??? public class Teacher {
    ??? ??? ??? ??? ??? private String name;??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? private String gender;??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? public String getGender() {
    ??? ??? ??? ??? ??? ??? return gender;
    ??? ??? ??? ??? ??? }??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? public void setGender(String gender) {
    ??? ??? ??? ??? ??? ??? this.gender = gender;
    ??? ??? ??? ??? ??? }??? ??? ??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? public String getName() {
    ??? ??? ??? ??? ??? ??? return name;
    ??? ??? ??? ??? ??? }??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? public void setName(String name) {
    ??? ??? ??? ??? ??? ??? this.name = name;
    ??? ??? ??? ??? ??? }??? ??? ??? ??? ?
    ??? ??? ??? ??? }
    ??? ?
    內(nèi)部類:
    ??? 定義:
    ??? ??? 定義在另外一個(gè)類中的類,就是內(nèi)部類。
    ??? ??? 編譯后生成的兩個(gè)獨(dú)立的類:Outer.class 和Outer$Inner.class。
    ??? ??? ?
    ??? 內(nèi)部類的分類:
    ??? ??? 靜態(tài)內(nèi)部類:靜態(tài)內(nèi)部類定義在類中,任何方法外,用static修飾
    ??? ??? ??? 靜態(tài)內(nèi)部類只能訪問外部類的靜態(tài)成員。
    ??? ??? ??? 在外部類的外部,要?jiǎng)?chuàng)建一個(gè)靜態(tài)內(nèi)部類對(duì)象不需要外部類對(duì)象:
    ??? ??? ??? ??? Outer.Inner in = new Outer.Inner();
    ??? ??? ??? 在本類內(nèi)部生成內(nèi)部類對(duì)象的方式:
    ??? ??? ??? ??? Inner in = new Inner();??? ?
    ??? ?
    ??? ??? 成員內(nèi)部類:作為外部類的一個(gè)成員存在,與外部類的屬性、方法并列
    ??? ??? ??? 在內(nèi)部類中可以直接訪問外部類的私有屬性。
    ??? ??? ??? 內(nèi)部類和外部類的實(shí)例變量允許命名沖突。
    ??? ??? ??? ??? 在內(nèi)部類中訪問實(shí)例變量:this.屬性
    ??? ??? ??? ??? 在內(nèi)部類訪問外部類的實(shí)例變量:外部類名.this.屬性
    ??? ??? ??? 在外部類的外部,要?jiǎng)?chuàng)建一個(gè)成員內(nèi)部類對(duì)象,要首先建立一個(gè)外部類對(duì)象,然后再創(chuàng)建一個(gè)成員內(nèi)部類對(duì)象。
    ??? ??? ??? ??? Outer out = new Outer();
    ??? ??? ??? ??? Outer.Inner in = out.new Inner();
    ??? ??? ??? 在本類內(nèi)部生成內(nèi)部類對(duì)象的方式:
    ??? ??? ??? ??? 在靜態(tài)方法中:Inner in = new Outer().new Inner();
    ??? ??? ??? ??? 在非靜態(tài)方法中:Inner in = this.new Inner();
    ??? ??? ??? 成員內(nèi)部類不可以有靜態(tài)成員,這是因?yàn)殪o態(tài)屬性是在加載類的時(shí)候創(chuàng)建,這個(gè)時(shí)候內(nèi)部類還沒有被創(chuàng)建。
    ??? ??? ??? ??? ?
    ??? ??? 局部?jī)?nèi)部類:在外部類的方法中定義的內(nèi)部類
    ??? ??? ??? 與局部變量類似,在局部?jī)?nèi)部類前不可以加修飾符public和private,其作用域?yàn)槎x它的代碼塊。
    ??? ??? ??? 局部?jī)?nèi)部類不僅可以訪問外部類的實(shí)例變量,還可以訪問外部類的局部變量,但要求外部類的局部變量必須為final的。
    ??? ??? ??? 配合接口使用,來做到強(qiáng)制弱耦合。
    ??? ??? ??? 在外部類的外部不可創(chuàng)建局部?jī)?nèi)部類對(duì)象,只能在局部?jī)?nèi)部類所在的方法中創(chuàng)建:
    ??? ??? ??? ??? Inner in = new Inner();
    ??? ??? ??? ?
    ??? ??? 匿名內(nèi)部類:一種特殊的局部?jī)?nèi)部類
    ??? ??? ??? 沒有名字,也沒有class、extends、implements關(guān)鍵字
    ??? ??? ??? 用一種隱含的方式實(shí)現(xiàn)一個(gè)接口或繼承一個(gè)類,并且只能創(chuàng)建一次實(shí)例。
    ??? ??? ??? 實(shí)現(xiàn)方式:在某個(gè)語(yǔ)句中,new 父類/父接口名字(){ 類體中實(shí)現(xiàn)方法 }
    ??? ??? ??? ??? 例如:
    ??? ??? ??? ??? ??? TreesSet ts = new TreeSet(new Comparator(){
    ??? ??? ??? ??? ??? ??? public int compare(Object o1, Object o2){
    ??? ??? ??? ??? ??? ??? ??? return 0;
    ??? ??? ??? ??? ??? ??? }
    ??? ??? ??? ??? ??? });
    ??? ??? ??? 匿名內(nèi)部類屬于局部?jī)?nèi)部類,那么局部?jī)?nèi)部類的所有限制都對(duì)其生效。
    ??? ??? ??? 匿名內(nèi)部類是唯一一種無構(gòu)造方法的類,因?yàn)闃?gòu)造器的名字必須合類名相同,而匿名內(nèi)部類沒有類名。


    異常:
    ??? 異常的分類
    ??? ??? Java會(huì)將所有的異常封裝成對(duì)象,其根本父類為Throwable。
    ??? ??? Throwable有兩個(gè)子類:Error 和Exception。
    ??? ??? ?
    ??? ??? Error:一個(gè)Error對(duì)象表示一個(gè)程序錯(cuò)誤,指的是底層的低級(jí)的不可恢復(fù)的嚴(yán)重錯(cuò)誤
    ??? ??? ??? 遇到Error,程序一定會(huì)退出,因?yàn)橐呀?jīng)失去了運(yùn)行所必須的物理環(huán)境。
    ??? ??? ??? 對(duì)于Error我們無法進(jìn)行處理,因?yàn)槲覀兪峭ㄟ^程序來應(yīng)對(duì)錯(cuò)誤的,可是程序已經(jīng)退出了。
    ??? ??? ??? ?
    ??? ??? Exception:由特定因素,導(dǎo)致程序無法繼續(xù),但不影響虛擬機(jī)的正常執(zhí)行。
    ??? ??? ??? 未檢查異常(Runtime Exception):
    ??? ??? ??? ??? 是因?yàn)槌绦騿T沒有進(jìn)行必要的檢查,由于程序員的疏忽而引起的異常。
    ??? ??? ??? ??? 對(duì)于未檢查異常可以不處理,編譯可以通過,應(yīng)對(duì)未檢查異常的方法就是養(yǎng)成良好的檢查習(xí)慣
    ??? ??? ??? 已檢查異常(非Runtime Exception):
    ??? ??? ??? ??? 是不可避免的,對(duì)于已檢查異常必須處理,否則編譯不通過。
    ?
    ??? 異常處理的機(jī)制:
    ??? ??? 當(dāng)一個(gè)方法中有一條語(yǔ)句出現(xiàn)了異常,它就會(huì)throw(拋出)一個(gè)異常對(duì)象(throw 異常對(duì)象),然后后面的語(yǔ)句不會(huì)執(zhí)行,而返回上一級(jí)方法,其上一級(jí)方法接受到了異常對(duì)象之后,有可能對(duì)這個(gè)異常進(jìn)行處理(進(jìn)行處理則不會(huì)上拋),也可能將這個(gè)異常傳到它的上一級(jí),如果最上一級(jí)(main方法)不處理就會(huì)傳給虛擬機(jī),虛擬機(jī)就會(huì)終止程序的運(yùn)行。
    ?
    ??? 異常的處理方式:throws和try-catch方法
    ??? ??? try-catch處理方式:
    ??? ??? ??? ??? try{??? ??? //一個(gè)
    ??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? (1)可能出現(xiàn)異常的語(yǔ)句
    ??? ??? ??? ??? ??? ?
    ??? ??? ??? ??? } catch(XxxException e /*捕獲的異常*/){??? //0或n個(gè)
    ??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? (2)處理異常的代碼
    ??? ??? ??? ??? ??? ?
    ??? ??? ??? ??? } finally{??? ??? //0或1個(gè)
    ??? ??? ??? ??? ?
    ??? ??? ??? ??? ??? (3)必須要執(zhí)行的代碼
    ??? ??? ??? ??? ??? ?
    ??? ??? ??? ??? }
    ??? ??? ??? ??? (4)方法中的其他代碼
    ??? ??? ??? ??? ??? ?
    ??? ??? ??? 如果代碼正確,那么程序不經(jīng)過catch語(yǔ)句直接向下運(yùn)行;
    ??? ??? ??? 如果代碼不正確,則將返回的異常對(duì)象和e進(jìn)行匹配,如果匹配成功,則處理其后面的異常處理代碼。
    ??? ??? ??? try中如果發(fā)現(xiàn)錯(cuò)誤,即跳出try塊去匹配catch,那么try后面的語(yǔ)句就不會(huì)被執(zhí)行。
    ??? ??? ??? 一個(gè)try可以跟多個(gè)catch語(yǔ)句,用于處理不同情況,但是不能將父類型的exception的位置寫在子類型的excepiton之前。
    ??? ??? ??? 在try-catch后還可以再跟一子句finally。其中的代碼語(yǔ)句論有沒有異常都會(huì)被執(zhí)行(因?yàn)閒inally子句的這個(gè)特性,所以一般將釋放資源,關(guān)閉連接的語(yǔ)句寫在里面)。
    ??? ??? ??? finally中的代碼和try-catch中的代碼沖突時(shí),finally中的代碼一定會(huì)被執(zhí)行且會(huì)忽略try-catch中的代碼。但是如果try-catch中有System.exit(0);(虛擬機(jī)退出語(yǔ)句),則不會(huì)去執(zhí)行fianlly中的代碼。
    ??? ??? ?
    ??? ??? throws/throw處理方式:
    ??? ??? ??? throw 寫在方法內(nèi),后面跟一個(gè)異常對(duì)象。
    ??? ??? ??? throws 在方法的定義中說明方法可能拋出的異常,后面跟異常類的名字,聲明這個(gè)方法將不處理異常,把異常交給上一級(jí)方法處理。
    ??? ??? ??? 調(diào)用時(shí),調(diào)用者不能拋出范圍更小的異常。
    ??? ??? ??? 對(duì)于方法a,如果它定義了throws Exception。那么當(dāng)它調(diào)用的方法b返回異常對(duì)象時(shí),方法a并不處理,而將這個(gè)異常對(duì)象向上一級(jí)返回,如果所有的方法均不進(jìn)行處理,返回到主方法,如主方法也不進(jìn)行處理,則到虛擬機(jī)中,程序中止。
    ??? ??? ??? 如果在方法的程序中有一行throw new Exception(),那么其后的程序不執(zhí)行,如果沒有對(duì)這個(gè)可能出現(xiàn)的檢查結(jié)果進(jìn)行處理,那么程序就會(huì)報(bào)錯(cuò)。
    ??? ??? ??? throws和throw沒有必然的聯(lián)系。
    ??? ?
    ??? ??? 注意:
    ??? ??? ??? 方法的覆蓋中,如果子類的方法拋出的例外是父類方法拋出的例外的父類型,那么編譯就會(huì)出錯(cuò):子類無法覆蓋父類。
    ??? ??? ??? 子類拋出的例外或者與父類拋出的例外一致,或者是父類拋出例外的子類型,或者子類型不拋出例外。
    ??? ??? ??? 如果父類型無throws時(shí),子類型也不允許出現(xiàn)throws。此時(shí)只能使用try catch。
    ?
    ??? ??? 自定義異常:
    ??? ??? ??? a. 使其繼承Exception或者RuntimeException。
    ??? ??? ??? b. 寫構(gòu)造器,直接調(diào)用父類的構(gòu)造器
    ??? ??? ??? ?
    斷言(assert):用來調(diào)試、測(cè)試代碼
    ??? 格式:
    ??? ??? assert 布爾表達(dá)式: 字符串? (如果布爾表達(dá)式為false時(shí),這個(gè)字符串才會(huì)顯示)
    ??? 注意:
    ??? ??? assert默認(rèn)是關(guān)閉的,使用時(shí)需要使用" -ea "進(jìn)行開啟," -da "是關(guān)閉,如:java -ea 類名。
    ??? ??? 斷言是以異常方式去執(zhí)行的,當(dāng)斷言的布爾表達(dá)式為假時(shí),會(huì)中斷代碼。
    ??? ??? 不能繼承性的打開(java -ea:類名? 這樣只能打開該類,如果存在父類,不會(huì)去打開父類)
    ??? ??? ?
    圖形界面:
    ??? AWT:抽象窗口工具(Abstract Window Toolkit)
    ??? ??? 組件:圖形界面中所有能看到的,比如按鈕等。
    ??? ??? 容器:用來管理其他組件的對(duì)象
    ??? ??? 布局管理器:布置組件在容器中的位置和大小
    ??? ??? ?
    ??? Swing:AWT的一個(gè)增強(qiáng)版
    ??? ??? ?
    ??? 構(gòu)造圖形界面的步驟:
    ??? ??? 選擇一個(gè)容器
    ??? ??? 設(shè)置容器的布局管理器
    ??? ??? 向容器中添加組件
    ??? ??? 事件的監(jiān)聽
    ??? ??? ?
    ??? 容器(Container):用于管理其他的組件的對(duì)象,組件必須放到容器里
    ??? ??? JFrame:一個(gè)最頂層的窗體容器,所有其他的組件必須放在頂層容器里。
    ??? ??? JPanel:不是頂層容器,必須放在頂層容器中,是透明的(默認(rèn))。
    ??? ??? 容器的方法:
    ??? ??? ??? add(Component com)? 將組件加入容器。?
    ??? ??? ??? setLayout(LayoutManager manager)? 設(shè)置布局管理器。?????
    ??? ??? ??? setSize(int width,int height)? 設(shè)置窗口大小
    ??? ??? ??? setVisible(boolean b)? 顯示或隱藏此組件
    ??? ??? ??? setDefaultCloseOperation(int operation)? 設(shè)置關(guān)閉窗體上時(shí)默認(rèn)執(zhí)行的操作
    ?
    ??? 布局管理:布置組件在容器中的位置和大小
    ??? ??? FlowLayout:流式布局管理,Panel和JPanel的默認(rèn)布局管理就是FlowLayout
    ??? ??? ??? 三種構(gòu)造方式:
    ??? ??? ??? ??? FlowLayout()?
    ??? ??? ??? ??? ??? 構(gòu)造一個(gè)新的 FlowLayout,居中對(duì)齊,默認(rèn)的水平和垂直間隙是 5 個(gè)單位。?
    ??? ??? ??? ??? FlowLayout(int align)?
    ??? ??? ??? ??? ??? 構(gòu)造一個(gè)新的 FlowLayout,對(duì)齊方式是指定的,默認(rèn)的水平和垂直間隙是 5 個(gè)單位。?
    ??? ??? ??? ??? FlowLayout(int align, int hgap, int vgap)?
    ??? ??? ??? ??? ??? 創(chuàng)建一個(gè)新的流布局管理器,具有指定的對(duì)齊方式以及指定的水平和垂直間隙。?
    ??? ??? ??? ??? ??? ?
    ??? ??? BorderLayout:按方位進(jìn)行布局管理,不明確指定,就會(huì)默認(rèn)加載在中間,F(xiàn)rame和JFrame默認(rèn)的布局管理器是BorderLayout
    ??? ??? ??? 兩種構(gòu)造方式:
    ??? ??? ??? ??? BorderLayout()?
    ????????? ??? ??? ??? ??? 構(gòu)造一個(gè)組件之間沒有間距的新邊界布局。?
    ??? ??? ??? ??? BorderLayout(int hgap, int vgap)?
    ????????? ??? ??? ??? ??? 用指定的組件之間的水平間距構(gòu)造一個(gè)邊界布局。?
    ?
    ??? ??? GridLayout:網(wǎng)格布局,通過行列、間距來用網(wǎng)格分割,把組件放入網(wǎng)格中,先行后列擺放組件。
    ??? ??? ??? 三種構(gòu)造方式:
    ??? ??? ??? ??? GridLayout()?
    ??? ??? ??? ??? ??? 創(chuàng)建具有默認(rèn)值的網(wǎng)格布局,即每個(gè)組件占據(jù)一行一列。?
    ??? ??? ??? ??? GridLayout(int rows, int cols)?
    ??? ??? ??? ??? ??? 創(chuàng)建具有指定行數(shù)和列數(shù)的網(wǎng)格布局。?
    ??? ??? ??? ??? GridLayout(int rows, int cols, int hgap, int vgap)?
    ??? ??? ??? ??? ??? 創(chuàng)建具有指定行數(shù)和列數(shù)的網(wǎng)格布局,并將水平和垂直間距設(shè)置為指定值。?
    ??? ??? ??? ?
    ??? 組件:圖形界面中所有能看到的
    ??? ??? JButton :按鈕
    ??? ??? JTextField:?jiǎn)涡形谋居?
    ??? ??? JTextArea:多行文本區(qū)
    ??? ??? JLabel:標(biāo)簽

    圖形界面:
    ??? 布局管理器:
    ??? ??? CardLayout:卡片布局,面板重疊放置,只能看到一個(gè),最先添加的會(huì)被顯示出來,可以進(jìn)行翻動(dòng)
    ??? ??? ??? 兩種構(gòu)造方法:
    ??? ??? ??? ??? CardLayout()?
    ????????? ??? ??? ??? ??? 創(chuàng)建一個(gè)間隙大小為 0 的新卡片布局。?
    ??? ??? ??? ??? CardLayout(int hgap, int vgap)?
    ????????? ??? ??? ??? ??? 創(chuàng)建一個(gè)具有指定的水平和垂直間隙的新卡片布局。?
    ????????? ??? ??? 常用的方法:
    ??? ??? ??? ??? previous(Container parent)?
    ????????? ??? ??? ??? ??? 翻轉(zhuǎn)到指定容器的前一張卡片。
    ????????? ??? ??? ??? show(Container parent, String name)?
    ????????? ??? ??? ??? ??? 翻轉(zhuǎn)到已添加到此布局的具有指定 name 的組件
    ????????? ??? ??? ??? next(Container parent)?
    ????????? ??? ??? ??? ??? 翻轉(zhuǎn)到指定容器的下一張卡片。
    ????????? ??? ??? ??? first(Container parent)?
    ????????? ??? ??? ??? ??? 翻轉(zhuǎn)到容器的第一張卡片。??? ?
    ????????? ??? ??? ??? last(Container parent)?
    ????????? ??? ??? ??? ??? 翻轉(zhuǎn)到容器的最后一張卡片。
    ????????? ??? ??? ??? ??? ?
    ????????? ??? GridBagLayout:增強(qiáng)版的網(wǎng)格布局,組件可以跨行跨列的進(jìn)行布局。
    ????????? ??? ??? 構(gòu)造方法:
    ????????? ??? ??? ??? GridBagLayout()?
    ????????? ??? ??? ??? ??? 創(chuàng)建網(wǎng)格包布局管理器。
    ????????? ??? ??? 注意:
    ????????? ??? ??? ??? 該布局管理器的具體實(shí)現(xiàn)需要借助GridBagConstraints類,利用GridBagConstraints類的屬性對(duì)組件進(jìn)行設(shè)置,具體內(nèi)容查看API文檔。
    ????????? ??? ??? ??? ?
    ??? 菜單項(xiàng):
    ??? ??? JMenuBar:菜單欄的實(shí)現(xiàn),將JMenu對(duì)象添加到菜單欄以構(gòu)造菜單
    ??? ??? ??? 構(gòu)造方法:
    ??? ??? ??? ??? JMenuBar()?
    ????????? ??? ??? ??? ??? 創(chuàng)建新的菜單欄。
    ????????? ??? ??? ??? ??? ?
    ??? ??? JMenu:菜單的該實(shí)現(xiàn)是一個(gè)包含JMenuItem的彈出窗口
    ??? ??? ??? 構(gòu)造方法:
    ??? ??? ??? ??? JMenu(String s)?
    ????????? ??? ??? ??? ??? 構(gòu)造一個(gè)新JMenu,用提供的字符串作為其文本。
    ????????? ??? ??? ??? ??? ?
    ??? ??? JMenuItem:菜單中的項(xiàng)的實(shí)現(xiàn),菜單項(xiàng)本質(zhì)上是位于列表中的按鈕
    ??? ??? ??? 構(gòu)造方法:
    ??? ??? ??? ??? JMenuItem(String text)?
    ????????? ??? ??? ??? ??? 創(chuàng)建帶有指定文本的JMenuItem。
    ????????? ??? ??? ??? ?
    AWT事件模型:
    ??? 事件模型的三要素:
    ??? ??? 事件源(Object):事件的產(chǎn)生者。
    ??? ??? 事件(EventObject):描述發(fā)生了什么事情。??
    ??? ??? 事件監(jiān)聽(EventListener):事件的處理者
    ??? ??? 關(guān)系:
    ??? ??? ??? 事件只與事件源有關(guān),與事件監(jiān)聽無關(guān)
    ??? ??? ??? 一個(gè)事件源可以注冊(cè)多個(gè)事件監(jiān)聽。
    ??? ??? ??? 一個(gè)事件監(jiān)聽器可以在多個(gè)事件源中注冊(cè)。
    ??? ??? ??? 一個(gè)事件源可以就同一類事件注冊(cè)多個(gè)事件監(jiān)聽。
    ??? ?
    ??? 事件處理機(jī)制:委派式的處理機(jī)制(是一種松耦合)
    ??? ??? 組件自身會(huì)產(chǎn)生事件對(duì)象,但本身不一定負(fù)責(zé)處理,而是交給一個(gè)監(jiān)聽者去處理
    ??? ??? ?
    ??? 實(shí)現(xiàn)監(jiān)聽的步驟:
    ??? ??? a. 實(shí)現(xiàn)監(jiān)聽接口implements XxxxListener
    ??? ??? b. 重寫方法actionPerformed(ActionEvent e)?
    ??? ??? c. 注冊(cè)監(jiān)聽addXxxxListener(ActionListener l)?
    ??? ??? ?
    ??? 適配器:一個(gè)重寫了所有接口中方法的類
    ??? ??? 在java.awt.event包中,會(huì)有一些適配器,也就是把相應(yīng)的XxxxListener,換成XxxxAdapter就是適配器。
    ??? ??? 在AWT中經(jīng)常用匿名內(nèi)部類來繼承適配器做監(jiān)聽

    JFC:java基礎(chǔ)類庫(kù)(具體的類可以查看API文檔)
    ?
    觀察者模式:
    ??? 事件監(jiān)聽者對(duì)事件源進(jìn)行監(jiān)聽,事件源會(huì)發(fā)生某些事件,監(jiān)聽者需要對(duì)事件作出相應(yīng)的處理。
    ??? ?
    ??? 事件監(jiān)聽者(Observer):??? ?
    ??? ??? 處理事件
    ??? ??? ?
    ??? 事件對(duì)象(Observable):
    ??? ??? 注冊(cè)監(jiān)聽
    ??? ??? 取消監(jiān)聽
    ??? ??? 通知監(jiān)聽
    ??? ??? ?
    ??? 編程步驟:
    ??? ??? a. 定義一個(gè)監(jiān)聽者,使其實(shí)現(xiàn)Observer接口,實(shí)現(xiàn)其中的方法update(Observable o, Object arg)。
    ??? ??? b. 定義一個(gè)事件對(duì)象,使其繼承Observable類,定義一個(gè)產(chǎn)生事件的方法,在方法里去注冊(cè)監(jiān)聽addObserver(Observer o)、標(biāo)志改變setChanged()(如果不寫,則說明該事件沒有發(fā)生,監(jiān)聽者不會(huì)反映)、啟動(dòng)監(jiān)聽notifyObservers()。
    ??? ??? ??? 注意:注冊(cè)監(jiān)聽和標(biāo)志改變不分先后,但標(biāo)志改變和啟動(dòng)監(jiān)聽是不能互換的。
    ??? ??? ??? ?
    ??? 應(yīng)用:當(dāng)某事物發(fā)生變化,需要采取行動(dòng),則可以采用觀察者模式。
    ??? ?
    適配器模式:
    ??? Adapter適配器模式是一種結(jié)構(gòu)型模式,將兩個(gè)互不兼容的類糾合在一起。
    ??? ?
    ??? 主要應(yīng)對(duì):由于應(yīng)用環(huán)境的變化,常常需要將“一些現(xiàn)存的對(duì)象”放在新的環(huán)境中應(yīng)用,但是,新環(huán)境要求的接口是現(xiàn)存對(duì)象所不滿足的。
    ??? ?
    ??? 作用:在不改變?cè)创a的情況下實(shí)現(xiàn)需求。
    ?
    java.math.BigDecimal:不可變的、任意精度的有符號(hào)十進(jìn)制數(shù)。
    ??? 必須用String類型進(jìn)行構(gòu)造,才能實(shí)現(xiàn)精確計(jì)算
    ?
    I/O流后面會(huì)詳細(xì)講解,今天的了解下就可以了。

    多線程:
    ??? 進(jìn)程與線程:
    ??? ??? 進(jìn)程:同一個(gè)操作系統(tǒng)中執(zhí)行的一個(gè)子程序,包含了三部分虛擬CPU、代碼、數(shù)據(jù)
    ??? ??? 多進(jìn)程:同一個(gè)操作系統(tǒng)中執(zhí)行的多個(gè)并行的子程序。可以提高cpu的使用率
    ??? ??? 線程:在同一個(gè)進(jìn)程當(dāng)中執(zhí)行的子程序流
    ??? ??? 多線程:同一個(gè)進(jìn)程當(dāng)中并發(fā)執(zhí)行的多個(gè)子程序流。可以提高cpu的使用率
    ??? ??? 進(jìn)程與線程的區(qū)別:
    ??? ??? ??? 進(jìn)程有獨(dú)立的進(jìn)程空間,進(jìn)程中的數(shù)據(jù)存放空間(堆空間和棧空間)是獨(dú)立的。
    ??? ??? ??? 線程的堆空間是共享的,棧空間是獨(dú)立的,線程消耗的資源也比進(jìn)程小,相互之間可以影響的。
    ??? ??? java中如何調(diào)進(jìn)程:
    ??? ??? ??? 調(diào)用本地程序的兩個(gè)類
    ??? ??? ??? ??? Runtime
    ??? ??? ??? ??? ??? Runtime.getRuntime.exec(...);??? //執(zhí)行一個(gè)程序
    ??? ??? ??? ??? ??? ??? 其返回值就是Process類型
    ??? ??? ??? ??? Process??? ??? ?
    ??? ??? 注意:
    ??? ??? ??? 只有運(yùn)行狀態(tài)的線程才有機(jī)會(huì)執(zhí)行代碼,主線程的中止不會(huì)影響其他的正在運(yùn)行中的線程,主線程中止也就是main()方法退出了。只有進(jìn)程中的所有線程都中止時(shí),進(jìn)程(JVM進(jìn)程)才會(huì)退出,只要有線程沒有中止,進(jìn)程就不會(huì)退出。
    ??? ??? ??? 操作系統(tǒng)決定線程是否有優(yōu)先級(jí),獨(dú)占式的操作系統(tǒng)中系統(tǒng)會(huì)有優(yōu)先級(jí)的概念,共享式的操作系統(tǒng)則不會(huì)有優(yōu)先級(jí)的。
    ??? ??? ??? 在線程的內(nèi)部,程序依然順序執(zhí)行
    ??? ?
    ??? 線程編程的兩種方法:
    ??? ??? 寫一個(gè)類,繼承Thread類,覆蓋Thread類中繼承來的run()方法,這樣就寫好了自定義的線程類。
    ??? ??? ??? 繼承java.lang.Thread類:
    ??? ??? ??? ??? class MyThread extends Thread{
    ??? ?? ??? ??? ??? ??? public void run(){??? ??? //覆蓋run(),線程體方法,自身其實(shí)就是普通的方法
    ??? ?? ??? ??? ??? ??? ??? .......
    ??? ??? ??? ??? ??? }
    ??? ??? ??? ??? }
    ??? ???? ??? 啟動(dòng)線程:
    ??? ??? ??? ??? public class TestThread{
    ??? ? ??? ??? ??? ??? public static void main(){
    ??? ? ??? ??? ??? ??? ??? Thread t1=new Mythread();
    ??? ? ??? ??? ??? ??? ??? T1.start();??? ??? //調(diào)用start()來啟動(dòng)線程,線程啟動(dòng)方法,向線程調(diào)度器說明當(dāng)前線程已經(jīng)準(zhǔn)備好了,是一種可運(yùn)行狀態(tài)
    ??? ? ??? ??? ??? ??? }
    ??? ??? ??? ??? }
    ??? ??? ??? ??? ?
    ??? ??? 寫一個(gè)類,實(shí)現(xiàn)Runable接口,實(shí)現(xiàn)其中的run()方法。這種方法寫好的類的對(duì)象需要作為線程類創(chuàng)建對(duì)象時(shí)構(gòu)造方法的參數(shù)。
    ??? ??? ??? 實(shí)現(xiàn)java.lang.Runnable接口:
    ??? ??? ??? ??? Class MyThread? implements Runnable{
    ??? ??? ? ??? ??? ??? public void run(){
    ??? ??? ??? ??? ?
    ??? ??? ? ??? ??? ??? }
    ??? ??? ??? ??? }
    ??? ???? ??? 啟動(dòng)線程:
    ??? ??? ??? ??? public class TestThread{
    ??? ??? ??? ??? ??? public static void main(){
    ??? ??? ??? ??? ??? ??? Runnable myThread = new MyThread();
    ??? ??? ??? ??? ??? ??? Thread t = new Thread(myThread);
    ??? ??? ??? ??? ??? ??? t.start();
    ??? ??? ??? ??? ??? }
    ??? ??? ??? ??? }
    ??? ??? ??? ??? ?
    ??? Thread中的一些方法:
    ??? ??? currentThread()?
    ??? ????????? ??? 返回對(duì)當(dāng)前正在執(zhí)行的線程對(duì)象的引用(實(shí)現(xiàn)接口方式時(shí)使用)
    ??? ??? sleep(long millis)?
    ????????? ??? ??? 在指定的毫秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行)。
    ??? ??? ??? 本線程不會(huì)去搶,除非sleep結(jié)束。
    ??? ??? ??? 多個(gè)線程之間都會(huì)去搶執(zhí)行權(quán)限,不會(huì)考慮優(yōu)先級(jí)。
    ??? ??? yield()?
    ????????? ??? ??? 暫停當(dāng)前正在執(zhí)行的線程對(duì)象,并執(zhí)行其他線程。
    ????????? ??? ??? 只給本類或者優(yōu)先級(jí)大于本類優(yōu)先級(jí)的線程去搶。
    ????????? ??? join()?
    ????????? ??? ??? 等待該線程終止。??? ?
    ????????? ??? ??? 放在start()前面則沒有用處。
    ????????? ??? setDaemon(boolean on)?
    ????????? ??? ??? 將該線程標(biāo)記為守護(hù)線程,守護(hù)線程需要依賴其他線程,會(huì)在虛擬機(jī)停止的時(shí)候停止。
    ??? ??? ????????? ??? ??? ?
    ??? 線程的生命周期:
    ??? ??? 1)初始狀態(tài):此時(shí)線程只是處于JVM進(jìn)程中,只是創(chuàng)建了一個(gè)線程對(duì)象,并沒有真正開始運(yùn)行。
    ??? ??? 2)可動(dòng)行狀態(tài):調(diào)用線程對(duì)象的start()方法,此時(shí)線程才真正的被創(chuàng)建,進(jìn)入可運(yùn)行狀態(tài),等待CPU的調(diào)度。“萬(wàn)事俱備,只欠CPU”。
    ??? ??? 3)運(yùn)行狀態(tài):正在運(yùn)行的線程,此時(shí)它擁有CPU的執(zhí)行權(quán)。
    ??? ??? 4)阻塞狀態(tài):運(yùn)行狀態(tài)中的線程,如果正在等待用戶輸入或調(diào)用了sleep()和join()等方法都會(huì)導(dǎo)致線程進(jìn)入阻塞狀態(tài),注意從阻塞狀態(tài)出來的線程不一定馬上回到運(yùn)行狀態(tài),而是重新回到可運(yùn)行狀態(tài),等待CPU的再次調(diào)度。
    ??? ??? 5)等待隊(duì)列狀態(tài):一個(gè)線程調(diào)用一個(gè)對(duì)象的wait()會(huì)自動(dòng)放棄該對(duì)象的鎖標(biāo)記,進(jìn)入等待隊(duì)列狀態(tài),只有當(dāng)有另外一線程調(diào)用臨界資源的notify()或notifyAll()方法,建議多使用notifyAll(),才會(huì)將等待隊(duì)列中的線程釋放,此線程進(jìn)入鎖池狀態(tài)。
    ??? ??? 6)鎖池狀態(tài):每個(gè)對(duì)象都有互斥鎖標(biāo)記,以防止對(duì)臨界資源的訪問造成數(shù)據(jù)的不一致,和數(shù)據(jù)的不完整性。一個(gè)線程擁有一個(gè)對(duì)象的鎖標(biāo)記后,另一線程想訪問該對(duì)象,必須在鎖池中等待。由系統(tǒng)決定哪個(gè)線程拿到鎖標(biāo)記并運(yùn)行。注意從鎖池狀態(tài)出來的線程不是馬上回到運(yùn)行狀態(tài),而是重新回到可運(yùn)行狀態(tài),等待CPU的再次調(diào)度。
    ??? ??? 7)終止?fàn)顟B(tài):一個(gè)線程運(yùn)行結(jié)束后稱為終止?fàn)顟B(tài),一個(gè)進(jìn)程中只有所有的線程退出后才會(huì)終止。


    多線程:
    ??? 多線程的同步:??? ?
    ??? ??? 多線程并發(fā)訪問同一個(gè)對(duì)象(臨界資源),如果不對(duì)線程進(jìn)行同步控制,破壞了原子操作(不可再分的操作),則會(huì)造成臨界資源(兩個(gè)線程同時(shí)訪問的資源)的數(shù)據(jù)不一致。???
    ?
    ??? ??? 每一個(gè)對(duì)象都有一個(gè)互斥的鎖標(biāo)記和一個(gè)鎖池。當(dāng)線程擁有這個(gè)對(duì)象的鎖標(biāo)記時(shí)才能訪問這個(gè)資源,沒有鎖標(biāo)記便進(jìn)入鎖池,保證在同步代碼塊中只有一個(gè)線程,解決了多線程同步控制的問題。
    ??? ??? ?
    ??? ??? 關(guān)鍵字:synchronized??? //線程在同步代碼中必須采用串行訪問
    ??? ??? ??? synchronized修飾代碼塊:對(duì)括號(hào)內(nèi)的對(duì)象object加鎖,只有拿到對(duì)象鎖標(biāo)記的線程才能進(jìn)入該代碼塊。
    ??? ?? ??? ??? ??? public void push(char c){?
    ??? ??????? ??? ??? ??? synchronized(object){ ??? //object只要是對(duì)象就可以,但必須保證是同一對(duì)象
    ??? ??????? ??? ??? ??? ??? ……
    ??? ??????? ??? ??? ??? ??? 同步代碼?
    ??? ??????? ??? ??? ??? ??? ……
    ??? ??????? ??? ??? ??? }?
    ??? ?? ??? ??? ??? }
    ??? ?? ??? ??? ??? ?
    ??? ??? ??? synchronized修飾方法:在整個(gè)方法范圍內(nèi)對(duì)當(dāng)前對(duì)象的加鎖,只有拿到對(duì)象鎖標(biāo)記的線程才能執(zhí)行該方法。盡可能的少用
    ??? ?? ??? ??? ??? public synchronized void push(char c) {
    ??? ??? ??? ??? ??? ……
    ??? ??? ??? ??? ??? 同步代碼?
    ??? ??? ??? ??? ??? ……??? ?
    ??? ??? ??? ??? }
    ??? ????? ??? ??? ??? ?
    ??? ??? 一個(gè)線程可以同時(shí)擁有多個(gè)對(duì)象的鎖標(biāo)記,鎖標(biāo)記如果過多,就會(huì)出現(xiàn)線程等待其他線程釋放鎖標(biāo)記,而又都不釋放自己的鎖標(biāo)記供其他線程運(yùn)行的狀況,造成死鎖。??? ??? ??? ??? ?
    ?
    ??? ??? 靜態(tài)方法可以是同步方法:但是它所鎖的并不是當(dāng)前對(duì)象,是類對(duì)象。
    ??? ??? 抽象方法不能是synchronized同步的方法。
    ??? ??? 構(gòu)造方法不能是synchronized同步的方法。
    ??? ??? ??? ?
    ??? ??? 線程因?yàn)槲茨玫芥i標(biāo)記而發(fā)生阻塞進(jìn)入鎖池(lock pool)。每個(gè)對(duì)象都有自己的一個(gè)鎖池的空間,用于放置等待運(yùn)行的線程。由系統(tǒng)決定哪個(gè)線程拿到鎖標(biāo)記并運(yùn)行
    ??? ??? ?
    ??? ??? 利用Collections類中的synchronizedXxxx(Xxxx ss)方法可以得到相應(yīng)集合的線程安全的集合
    ??? ??? ?
    ??? ??? 注意:
    ??? ??? ??? 在同步語(yǔ)句塊中不能直接操作對(duì)象鎖正在使用的對(duì)象。
    ??? ??? ??? 對(duì)象與鎖一一對(duì)應(yīng)。
    ??? ??? ??? 同步依賴對(duì)象鎖,鎖對(duì)象相同,同步語(yǔ)句串行,鎖對(duì)象不同,同步語(yǔ)句并行。
    ??? ??? ??? 順序鎖,不要回調(diào),反向打開。
    ??? ??? ??? 能不用同步就不用同步,有數(shù)據(jù)共享沖突時(shí)才使用同步。
    ??? ??? ?
    ??? 等待通知機(jī)制:
    ??? ??? 線程間通信使用的空間稱之為對(duì)象的等待對(duì)列(wait pool),該隊(duì)列也是屬于對(duì)象的空間的。
    ??? ??? ?
    ??? ??? 使用Object類中wait()的方法,在運(yùn)行狀態(tài)中,線程調(diào)用wait(),此時(shí)表示線程將釋放自己所有的鎖標(biāo)記和CPU的占用,同時(shí)進(jìn)入這個(gè)對(duì)象的等待池。等待池的狀態(tài)也是阻塞狀態(tài),只不過線程釋放自己的鎖標(biāo)記。只有在對(duì)該對(duì)象加鎖的同步代碼塊里,才能掉用該對(duì)象的wait(),表示線程將會(huì)釋放所有鎖標(biāo)記,進(jìn)入等待隊(duì)列,線程將進(jìn)入等待隊(duì)列狀態(tài)。
    ??? ??? ?
    ??? ??? 一個(gè)線程進(jìn)入了一個(gè)對(duì)對(duì)象加鎖的同步代碼塊,并對(duì)該對(duì)象調(diào)用了wait()方法,釋放自己擁有的所有鎖標(biāo)記,進(jìn)入該對(duì)象等待隊(duì)列,另一個(gè)線程獲得了該對(duì)象的鎖標(biāo)記,進(jìn)入代碼塊對(duì)該對(duì)象調(diào)用了notify()方法,就會(huì)從等待隊(duì)列里釋放出一線程,釋放出的這個(gè)線程要繼續(xù)運(yùn)行就還要進(jìn)入那個(gè)同步代碼塊,因?yàn)榈貌坏揭L問代碼塊對(duì)象的鎖標(biāo)記,而進(jìn)入該對(duì)象的鎖池,等待鎖標(biāo)記釋放。
    ??? ??? ?
    ??? ??? 什么情況下釋放鎖:
    ??? ??? ??? 同類代碼執(zhí)行完畢。
    ??? ??? ??? 異常未處理,錯(cuò)誤退出。
    ??? ??? ??? 調(diào)用wait()。
    ??? ??? ?
    ??? ??? 相關(guān)方法:
    ??? ??? ??? 1) wait():交出鎖和CPU的占用;?
    ??? ??? ??? 2) notify():將從對(duì)象的等待池中移走一個(gè)任意的線程,并放到鎖池中,那里的對(duì)象一直在等待,直到可以獲得對(duì)象的鎖標(biāo)記。?
    ??? ??? ??? 3) notifyAll(): 將從等待池中移走所有等待那個(gè)對(duì)象的線程并放到鎖池中,只有鎖池中的線程能獲取對(duì)象的鎖標(biāo)記,鎖標(biāo)記允許線程從上次因調(diào)用wait()而中斷的地方開始繼續(xù)運(yùn)行
    ??? ??? ??? ?
    ??? ??? 注意:
    ??? ??? ??? 用notifyAll()取代notify(),因?yàn)樵谡{(diào)用notify()方法時(shí),是由系統(tǒng)決定釋放出哪個(gè)線程。
    ??? ??? ??? 只能對(duì)加鎖的資源進(jìn)行wait()和notify()。
    ??? ??? ??? 判斷是否進(jìn)行等待wait()時(shí),用while代替if來進(jìn)行判斷。
    ??? ??? ??? ?
    I/O流
    ??? 字節(jié)輸入流:InputStream類為所有字節(jié)輸入流的父類
    ??? ??? 三個(gè)基本的read()方法:?
    ??? ????? ??? ??? int read()
    ??? ????? ??? ??? ??? 從流里讀出的一個(gè)字節(jié)。不推薦使用
    ??? ????? ??? ??? int read(byte[] b)
    ??? ????? ??? ??? ??? 將數(shù)據(jù)讀入到字節(jié)數(shù)組中,并返回所讀的字節(jié)數(shù)
    ??? ????? ??? ??? int read(byte[] b, int off, int len)
    ??? ????? ??? ??? ??? off? 從哪里開始讀。
    ??? ????? ??? ??? ??? len? 讀取多少。
    ??? ????? ??? ??? ??? 將輸入流中最多 len 個(gè)數(shù)據(jù)字節(jié)讀入字節(jié)數(shù)組。
    ??? ??? 其它方法:?
    ??? ????? ??? ??? void close()?
    ??? ????? ??? ??? ??? 關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源。
    ??? ????? ??? ??? int available()
    ??? ????? ??? ??? ??? 返回不受阻塞地從此輸入流讀取的字節(jié)數(shù)。
    ??? ????? ??? ??? long skip(long n)
    ??? ????? ??? ??? ??? 跳過和放棄此輸入流中的n個(gè)數(shù)據(jù)字節(jié),該方法有可能失效。
    ??? ????? ??? ??? boolean markSupported()
    ??? ????? ??? ??? ??? 測(cè)試此輸入流是否支持 mark 和 reset 方法。
    ??? ????? ??? ??? void mark(int n)
    ??? ????? ??? ??? ??? 在此輸入流中標(biāo)記當(dāng)前的位置
    ??? ????? ??? ??? void reset()
    ??? ????? ??? ??? ??? 將此流重新定位到對(duì)此輸入流最后調(diào)用 mark 方法時(shí)的位置。?
    ?
    ??? 字節(jié)輸出流:OutputStream類是所有字節(jié)輸入流的父類
    ??? ??? 三個(gè)基本的write()方法:?
    ??? ??? ??? void write(int n)
    ??? ??? ??? ??? 將指定的字節(jié)寫入此輸出流。
    ??? ??? ??? void write(byte[] b)?
    ??? ??? ??? ??? 將 b.length 個(gè)字節(jié)從指定的字節(jié)數(shù)組寫入此輸出流。
    ??? ??? ??? void write(byte[] b, int off, int len)
    ??? ??? ??? ??? 將指定字節(jié)數(shù)組中從偏移量off開始的len個(gè)字節(jié)寫入此輸出流。
    ??? ??? 其它方法:?
    ??? ??? ??? void close()
    ??? ??? ????? ??? ??? 關(guān)閉此輸出流并釋放與此流有關(guān)的所有系統(tǒng)資源。
    ??? ??? ??? void flush()
    ??? ??? ????? ??? ??? 刷新此輸出流并強(qiáng)制寫出所有緩沖的輸出字節(jié)。?
    ??? ??? ????? ??? ??? ?
    ??? 文件輸入輸出流:FileInputStream和FileOutputStream
    ??? ??? 要構(gòu)造一個(gè)FileInputStream,所關(guān)聯(lián)的文件必須存在而且是可讀的。
    ??? ??? ??? 如:
    ??? ??? ??? ??? FileInputStream fis = new FileInputStream("myfile.dat");?
    ??? ??? 要構(gòu)造一個(gè)FileOutputStream,而輸出文件已經(jīng)存在,則它將被覆蓋。??? ??? ???? ?
    ??? ??? ??? 如:??? ??? ??? ?
    ??? ??? ?? ??? ??? FIleOutputStream fos = new FileOutputStream("results.dat");?
    ??? ??? ?? ??? 要想以追加的方式寫,則需要一個(gè)額外的參數(shù),如:
    ??? ??? ??? ??? FileOutputStream outfile = new FileOutputStream("results.dat" ,true);??? //參數(shù)為true時(shí)輸出為追加,為false時(shí)為覆蓋。?

    I/O流
    ??? 流的概念:程序與數(shù)據(jù)來源之間的橋梁
    ??? ?
    ??? 流的分類:
    ??? ??? 按數(shù)據(jù)方向分:輸入流和輸出流
    ??? ??? ??? ?輸入流:InputStream/Reader
    ??? ??? ??? ?OutputStream/Writer
    ??? ??? 按數(shù)據(jù)類型分:字節(jié)流和字符流
    ??? ??? ??? 字節(jié)流:InputStream/OutputStream
    ??? ??? ??? 字符流:Reader/Writer
    ??? ??? 按流的功能分:節(jié)點(diǎn)流和處理流
    ??? ??? ??? 節(jié)點(diǎn)流用操作數(shù)據(jù)的來源。
    ??? ??? ??? 處理流用來封裝節(jié)點(diǎn)流,從而給節(jié)點(diǎn)流增加一個(gè)功能,不能獨(dú)立存在,在關(guān)閉流時(shí)如果使用了處理流,只需關(guān)閉最外層的流就可以了。
    ??? ??? ??? 區(qū)分節(jié)點(diǎn)流和處理流的小方法:
    ??? ??? ??? ??? 看構(gòu)造器,節(jié)點(diǎn)流參數(shù)為數(shù)據(jù)來源,而處理流參數(shù)為其他流。
    ??? ?
    ??? 選擇流的思路:
    ??? ??? 先考慮是輸入流還是輸出流,
    ??? ??? 再考慮是字節(jié)流還是字符流,
    ??? ??? 最后考慮是節(jié)點(diǎn)流還是處理流。
    ??? ??? ?
    ??? 字符流:Reader和Writer所有字符流的父類型
    ??? ??? Java技術(shù)使用Unicode來表示字符串和字符,而且提供16位版本的流,以便用類似的方法處理字符。?
    ??? ??? 如果構(gòu)造了一個(gè)連接到流的Reader和Writer,轉(zhuǎn)換規(guī)則會(huì)在使用缺省平臺(tái)所定義的字節(jié)編碼和Unicode之間切換。?
    ??? ??? ?
    ??? 橋梁流:InputStreamReader和OutputStreamWriter(字節(jié)流轉(zhuǎn)化成字符流的橋轉(zhuǎn)換器)
    ??? ??? 這兩個(gè)類不是用于直接輸入輸出的,他是將字節(jié)流轉(zhuǎn)換成字符流的橋轉(zhuǎn)換器,并可以指定編解碼方式。
    ??? ??? ??? ?
    ??? 逐行讀寫流:BufferedReader/BufferedWriter
    ??? ??? 以上兩個(gè)都是過濾流,需要用其他的節(jié)點(diǎn)流來作參數(shù)構(gòu)造對(duì)象。
    ??? ??? BufferedReader的方法:readLine():String ,當(dāng)他的返回值是null時(shí),就表示讀取完畢了。要注意,再寫入時(shí)要注意寫換行符,否則會(huì)出現(xiàn)阻塞。
    ??? ??? BufferedWriter的方法:newLine() ,這個(gè)方法會(huì)寫出一個(gè)換行符。
    ??? ??? ?
    ??? 管道流:線程交互的時(shí)候使用
    ??? ??? PipedInputStream/PipedOutputStream
    ??? ??? ??? 傳送輸出流可以連接到傳送輸入流,以創(chuàng)建通信管道。傳送輸出流是管道的發(fā)送端。通常,數(shù)據(jù)由某個(gè)線程寫入 PipedOutputStream 對(duì)象,并由其他線程從連接的 PipedInputStream 讀取。
    ??? ??? 注意:管道輸出流和管道輸入流需要對(duì)接。
    ??? ??? ??? ?
    ??? 數(shù)據(jù)流:DataInputStream和DataOutputStream
    ??? ??? 通過流來讀寫Java基本類,注意DataInputStream和DataOutputStream的方法是成對(duì)的。?
    ??? ??? 支持直接輸出輸入各種數(shù)據(jù)類型。
    ??? ??? 注意:使用DataOutputStream/DataInputStream時(shí),要注意寫入順序和讀取順序相同,否則會(huì)將沒有分割寫入的信息分割不正確而讀取出錯(cuò)誤的數(shù)據(jù)。
    ??? ??? ?
    ??? Properties類:針對(duì)屬性文件(*.properties,內(nèi)容是name=value)進(jìn)行操作,在java.util包下??? ?
    ??? ??? load(InputStream inStream)?
    ????????? ??? ??? 從輸入流中讀取屬性列表(鍵和元素對(duì))。
    ????????? ??? getProperty(String key)?
    ????????? ??? ??? 用指定的鍵在此屬性列表中搜索屬性。
    ??? ?
    ??? java編碼方式:
    ??? ??? 編碼:把字符轉(zhuǎn)換成數(shù)字存儲(chǔ)到計(jì)算機(jī)中,按ASCII將字母映射為整數(shù)。
    ??? ??? 解碼:把數(shù)字從計(jì)算機(jī)轉(zhuǎn)換成相應(yīng)的字符的過程。??? ?
    ??? ??? ?
    ??? ??? 不同的國(guó)家有不同的編碼,當(dāng)編碼方式和解碼方式不統(tǒng)一時(shí),產(chǎn)生亂碼。
    ??? ??? 因?yàn)槊绹?guó)最早發(fā)展軟件,所以每種的編碼都向上兼容ASCII 所以英文沒有亂碼。
    ??? ??? ??? ASCII(英文)??? ??????????????? 1個(gè)字符占一個(gè)字節(jié)(所有的編碼集都兼容ASCII)
    ??? ??? ??? ISO8859-1(拉丁文)? ??? ? 1個(gè)字符占一個(gè)字節(jié)
    ??? ??? ??? GB-2312/GBK??????? ??? ??? ? 1個(gè)字符占兩個(gè)字節(jié)(多用于中文)
    ??? ??? ??? Unicode??????????? ??? ??? ? 1個(gè)字符占兩個(gè)字節(jié)(網(wǎng)絡(luò)傳輸速度慢)
    ??? ??? ??? UTF-8????????????? ??? ??? ? 變長(zhǎng)字節(jié),對(duì)于英文一個(gè)字節(jié),對(duì)于漢字兩個(gè)或三個(gè)字節(jié)。
    ??? ??? ??? ?
    ??? ??? 中文編碼時(shí)出現(xiàn)亂碼的情況:
    ??? ??? ??? 用流操作文件。
    ??? ??? ??? 網(wǎng)頁(yè)(動(dòng)態(tài)靜態(tài))。
    ??? ??? ??? 網(wǎng)絡(luò)傳遞消息。
    ??? ??? ??? ?
    ??? ??? 解決亂碼的方式:
    ??? ??? ??? String temp = 亂碼的字符串
    ??? ??? ??? temp = new String(temp.getBytes("ISO8859-1") , "GBK")???
    ??? ??? ??? ??? 將temp按照ISO8859-1的方式進(jìn)行解碼生成一個(gè)字節(jié)序列,然后在按照GBK的方式解碼字節(jié)序列生成字符串。
    ??? ??? ?
    ??? File類:可表示文件或者目錄
    ??? ??? File下的方法是對(duì)磁盤上的文件進(jìn)行磁盤操作,但是無法讀寫文件的內(nèi)容。
    ?
    ??? ??? 構(gòu)造器:
    ??? ??? ??? File(String pathname)??? //以文件的路徑做參數(shù)
    ??? ??? ??? ?
    ??? ??? File類的方法:
    ??? ??? ??? boolean createNewFile()?
    ??? ??? ??? ??? 創(chuàng)建一個(gè)新文件
    ??? ??? ??? File createTempFile(String prefix, String suffix, File directory)?
    ?????????? ??? ??? ??? 在指定目錄中創(chuàng)建一個(gè)新的空文件,使用給定的前綴和后綴字符串生成其名稱。會(huì)在前綴和后綴之間加一個(gè)隨機(jī)數(shù)?
    ??? ??? ??? boolean mkdir()
    ??? ??? ??? ??? 創(chuàng)建一個(gè)新目錄
    ??? ??? ??? boolean delete()
    ??? ??? ??? ??? 刪除文件,刪除的是創(chuàng)建File對(duì)象時(shí)指定與之關(guān)聯(lián)創(chuàng)建的那個(gè)文件。
    ??? ??? ??? String[] List()
    ??? ??? ??? ??? 返回當(dāng)前File對(duì)象下所有顯文件和目錄名(相對(duì)路徑)
    ??? ??? ??? File[] ListFiles()
    ??? ??? ??? ??? 返回當(dāng)前File對(duì)象(必須是目錄)下的所有File對(duì)象,可以用getName()來訪問到文件名。
    ??? ??? ??? boolean isDirectory()和boolean isFile()
    ??? ??? ??? ??? 判斷究竟是目錄還是文件。
    ??? ??? ??? boolean exists()?
    ??? ??? ??? ??? 判斷文件或文件夾是否存在。
    ??? ??? ??? String getPath()
    ??? ??? ??? ??? 獲得相對(duì)路徑。
    ??? ??? ??? String getAbsolutePath()
    ??? ??? ??? ??? 獲得文件的絕對(duì)路徑
    ??? ??? ?
    ??? ??? 注意:
    ??? ??? ??? File類的對(duì)象實(shí)施表示一個(gè)文件并不是真正的文件,只是一個(gè)代理而已,通過這個(gè)代理來操作文件
    ??? ??? ??? 創(chuàng)建一個(gè)文件對(duì)象和創(chuàng)建一個(gè)文件在java中是兩個(gè)不同的概念。前者是在虛擬機(jī)中創(chuàng)建了一個(gè)文件,但卻并沒有將它真正地創(chuàng)建到OS的文件系統(tǒng)中,隨著虛擬機(jī)的關(guān)閉,這個(gè)創(chuàng)建的對(duì)象也就消失了。而創(chuàng)建一個(gè)文件才是在系統(tǒng)中真正地建立一個(gè)文件。
    ??? ??? ??? 例如:
    ??? ??? ??? ??? File f=new File(“11.txt”);??? //創(chuàng)建一個(gè)名為11.txt的文件對(duì)象
    ??? ??? ??? ??? f.CreateNewFile();???? ??? //真正地創(chuàng)建文件
    ?
    ??? RandomAccessFile:?
    ??? ??? 允許隨機(jī)訪問文件,類支持直接輸出輸入各種數(shù)據(jù)類型。
    ??? ??? ?
    ??? ??? 構(gòu)造器:
    ??? ??? ??? RandomAccessFile(File file, String mode)?
    ????????? ??? ??? ??? 創(chuàng)建從中讀取和向其中寫入(可選)的隨機(jī)存取文件流,該文件由 File 參數(shù)指定。?
    ??? ??? ??? RandomAccessFile(String name, String mode)?
    ????????? ??? ??? ??? 創(chuàng)建從中讀取和向其中寫入(可選)的隨機(jī)存取文件流,該文件具有指定名稱。?
    ??? ??? ??? ??? mode( r:以只讀方式打開????? rw:可讀可寫,不存在則創(chuàng)建)
    ?
    ??? ??? 相關(guān)方法:
    ??? ??? ??? long getFilePointer()
    ??? ??? ??? ??? 返回文件指針的當(dāng)前位置。?
    ??? ??? ??? void seek(long pos)
    ??? ??? ??? ??? 設(shè)置文件指針到給定的絕對(duì)位置。?
    ??? ??? ??? long length()
    ??? ??? ??? ??? 返回文件的長(zhǎng)度。??? ??? ??? ?
    ??? ??? ??? ??? ?
    ??? 對(duì)象流:ObjectInputStream和ObjectOutputStream(實(shí)現(xiàn)對(duì)象序列化)
    ??? ??? 對(duì)象流是過濾流,需要節(jié)點(diǎn)流作參數(shù)來構(gòu)造對(duì)象,用于直接把對(duì)象寫入文件和從文件中讀取對(duì)象。
    ??? ??? 只有實(shí)現(xiàn)了Serializable接口的類型的對(duì)象才可以被讀寫,Serializable接口是個(gè)標(biāo)記接口,其中沒有定義方法。
    ??? ??? 對(duì)象會(huì)序列化成一個(gè)二進(jìn)制代碼,文件中保存對(duì)象的屬性。
    ??? ??? ?
    ??? ??? writeObject(o)、readObject()這兩個(gè)是對(duì)象讀寫操作時(shí)用的方法。
    ??? ??? ??? Object o = new Object();??? ?
    ??? ??? ??? FileOutputStream fos=new FileOutputStream("Object.txt");
    ??? ??? ??? ObjectOutputStream oos=new ObjectOutputStream(fos);
    ??? ??? ??? oos.writeObject(o);
    ??? ??? ??? oos.close();
    ?
    ??? ??? ??? FileInputStream fis =new FileInputStream(“Object.txt”);
    ??? ??? ??? ObjectInputStream ois =new ObjectInputStream(fis);
    ??? ??? ??? Object o = (Object)Ois.readObject();
    ??? ??? ??? ois.close();
    ?
    ??? ??? 一個(gè)類中有其他類型的對(duì)象,那么,這個(gè)類實(shí)現(xiàn)了Serializable接口,在對(duì)象序列化時(shí),也同樣要求這個(gè)類中屬性都能夠?qū)ο笮蛄谢ɑ绢愋统猓?
    ??? ??? ?
    ??? ??? 注意:
    ??? ??? ??? 對(duì)于對(duì)象流的操作,在寫對(duì)象時(shí)要一次寫入完畢,如果使用追加模式寫入,只會(huì)讀取到上一次寫入的對(duì)象,使用對(duì)象流寫入時(shí),會(huì)先寫入一個(gè)頭部,然后寫入數(shù)據(jù),最后加上結(jié)束符號(hào),如果使用追加方式寫入的話,那就會(huì)在結(jié)束符號(hào)繼續(xù)向下寫入,但是在讀取時(shí)只會(huì)讀到結(jié)束符為止,以后再次寫入的數(shù)據(jù)就會(huì)丟失。
    ?
    ??? ??? ??????
    I/O流
    ??? 對(duì)象流:ObjectInputStream和ObjectOutputStream
    ??? ??? 對(duì)象流是過濾流,需要節(jié)點(diǎn)流作參數(shù)來構(gòu)造對(duì)象,用于直接把對(duì)象寫入文件和從文件中讀取對(duì)象。
    ??? ??? 只有實(shí)現(xiàn)了Serializable接口的類型的對(duì)象才可以被讀寫,Serializable接口是個(gè)標(biāo)記接口,其中沒有定義方法。
    ??? ??? 對(duì)象會(huì)序列化成一個(gè)二進(jìn)制代碼。
    ??? ??? ?
    ??? ??? writeObject(o)、readObject()這兩個(gè)是對(duì)象讀寫操作時(shí)用的方法。
    ??? ??? ??? Object o = new Object();??? ?
    ??? ??? ??? FileOutputStream fos=new FileOutputStream("Object.txt");
    ??? ??? ??? ObjectOutputStream oos=new ObjectOutputStream(fos);
    ??? ??? ??? oos.writeObject(o);
    ??? ??? ??? oos.close();
    ?
    ??? ??? ??? FileInputStream fis =new FileInputStream("Object.txt");
    ??? ??? ??? ObjectInputStream ois =new ObjectInputStream(fis);
    ??? ??? ??? Object o = (Object)ois.readObject();
    ??? ??? ??? ois.close();
    ??? ??? ?
    ??? ??? transient只能用來修飾屬性。表示這個(gè)屬性在對(duì)象序列化時(shí)將被忽略。
    ??? ??? ??? transient int num;
    ??? ??? ??? 表示當(dāng)我們進(jìn)行序列化時(shí)忽略這個(gè)屬性。
    ?
    ??? ??? 注意:
    ??? ??? ??? 對(duì)于對(duì)象流的操作,在寫對(duì)象時(shí)要一次寫入完畢,如果使用追加模式寫入,只會(huì)讀取到上一次寫入的對(duì)象。使用對(duì)象流寫入時(shí),會(huì)先寫入一個(gè)頭部,然后寫入數(shù)據(jù),最后加上結(jié)束符號(hào),如果使用追加方式寫入的話,那就會(huì)在結(jié)束符號(hào)繼續(xù)向下寫入,但是在讀取時(shí)只會(huì)讀到結(jié)束符為止,以后再次寫入的數(shù)據(jù)就會(huì)丟失。
    ??? ??? ??? 包名、類名和屬性可以被序列化,方法和構(gòu)造器不會(huì)被序列化的。
    ??? ??? ??? 靜態(tài)屬性不會(huì)被序列化的。
    ??? ??? ??? 屬性會(huì)被遞歸序列化的,也就是一個(gè)類中有引用類型的屬性,如果這個(gè)屬性對(duì)應(yīng)的類實(shí)現(xiàn)了Serializable接口,在對(duì)象序列化時(shí),也同樣會(huì)對(duì)這個(gè)類中的屬性進(jìn)行對(duì)象序列化,如果沒有實(shí)現(xiàn)Serializable接口,則會(huì)拋出異常。
    ??? ??? ??? 所有屬性必須都是可序列化的,特別是當(dāng)有些屬性本身也是對(duì)象的時(shí)候,要尤其注意這一點(diǎn)。
    ??? ??? ??? 網(wǎng)絡(luò)中傳遞對(duì)象必須實(shí)現(xiàn)序列化。??? ?
    ??? ?
    nio無阻塞的I/O(優(yōu)化的I/O)??? ?
    ??? java.nio?? 定義塊
    ??? ??? Buffer類:一種用于特定的基本類型數(shù)據(jù)的容器
    ??? ??? ??? 緩沖:就是塊,用來存儲(chǔ)內(nèi)容。
    ??? ??? ??? 容量:內(nèi)存開辟的大小,根據(jù)類型的不同,有不同的空間。
    ??? ??? ??? 界限:可用部分,即不應(yīng)讀取或?qū)懭氲牡谝粋€(gè)元素的索引。
    ??? ??? ??? 位置:當(dāng)前指針的位置,從0開始。??? ?
    ??? ??? ??? 容量>=界限>=位置
    ??? ??? ??? ??? ?
    ??? ??? ??? 相關(guān)方法:
    ??? ??? ??? ??? int capacity()?
    ????????? ??? ??? ??? ??? 返回此緩沖區(qū)的容量。?
    ????????? ??? ??? ??? int limit()?
    ????????? ??? ??? ??? ??? 返回此緩沖區(qū)的界限。?
    ????????? ??? ??? ??? int position()?
    ????????? ??? ??? ??? ??? 返回此緩沖區(qū)的位置。?
    ????????? ??? ??? ??? Buffer flip()?
    ????????? ??? ??? ??? ??? 相當(dāng)于截?cái)鄾]有用的空間,然后把指針移向開頭,使limit=position,position=0
    ????????? ??? ??? ??? Buffer position(int newPosition)?
    ????????? ??? ??? ??? ??? 設(shè)置此緩沖區(qū)的位置。?
    ????????? ??? ??? ??? ??? ?
    ??? ??? ??? 當(dāng)有大的文件需要處理的時(shí)候,為了不影響性能建議用直接緩沖。
    ??? ??? ??? Buffer有直接緩沖和間接緩沖兩種。
    ??? ??? ??? 只有ByteBuffer類提供了直接緩沖。使用直接緩沖,不影響程序。其它類想用直接緩沖需要進(jìn)行轉(zhuǎn)換。
    ??? ??? ?
    ??? java.nio.channels??? 對(duì)塊進(jìn)行讀寫的通道,類似于以前的流
    ??? ??? Channel接口:用于 I/O 操作的連接
    ??? ??? ?
    ??? ??? 編程步驟:
    ??? ??? ??? a. 先創(chuàng)建一個(gè)I/O流,
    ??? ??? ??? b. 使用I/O流.getChannel()方法,獲得通道,
    ??? ??? ??? c. 創(chuàng)建大小合適的ByteBUffer,
    ??? ??? ??? d. 通道的對(duì)象.read(buffer)/write(buffer)進(jìn)行讀寫,
    ??? ??? ??? e. 關(guān)閉所有的流和通道,
    ??? ??? ??? f. 如果有多線程并發(fā),可以使用"通道.lock()"獲得FileLock對(duì)象,用FileLock.release() 釋放此鎖定。
    ??? ??? ??? g. 當(dāng)遇到編碼問題,使用CharSet、CharsetDecoder、CharsetEncoder三個(gè)類去解決
    ??? ??? ??? ?
    ??? ??? 注意:
    ??? ??? ??? 在讀之前需要調(diào)用一下clear()方法,幫助讀操作清理緩沖;寫之前需要調(diào)用flip()方法,幫助寫操作清理緩沖。
    ??? ?
    ??? java.nio.charset??? 字符集,進(jìn)行編碼解碼??? ??? ?
    ??? ??? Charset類:編碼類,編碼的信息
    ??? ??? ??? forName(String charsetName)
    ??? ??? ??? ??? 生成一個(gè)CharSet實(shí)例。
    ??? ??? ??? decode(ByteBuffer bb)?
    ????????? ??? ??? ??? 將此 charset 中的字節(jié)解碼成 Unicode 字符的便捷方法。
    ????????? ??? ??? encode(CharBuffer cb)?
    ????????? ??? ??? ??? 將此 charset 中的 Unicode 字符編碼成字節(jié)的便捷方法。
    ????????? ??? ??? ??? ?
    ??? ??? CharsetDecoder類:解碼器
    ??? ??? ??? 能夠把特定 charset 中的字節(jié)序列轉(zhuǎn)換成 16 位 Unicode 字符序列的引擎。
    ??? ??? ??? ?
    ??? ??? CharsetEncoder類:編碼器,編碼的行為
    ??? ??? ??? 能夠把 16 位 Unicode 字符序列轉(zhuǎn)換成特定 charset 中字節(jié)序列的引擎。
    ?
    網(wǎng)絡(luò)編程:
    ??? 網(wǎng)絡(luò)基礎(chǔ)知識(shí)
    ??? ??? Mac地址:每個(gè)網(wǎng)卡專用地址,也是唯一的。
    ??? ??? 端口(port):應(yīng)用程序(進(jìn)程)的標(biāo)識(shí)(網(wǎng)絡(luò)通信程序)
    ??? ??? ??? OS中可以有65536(2^16)個(gè)端口,進(jìn)程通過端口交換數(shù)據(jù)。
    ??? ??? ??? 端口是一種抽象的軟件結(jié)構(gòu),與協(xié)議相關(guān):TCP的23端口和UDT的23端口為兩個(gè)不同的概念。
    ??? ??? ??? 端口應(yīng)該用1024以上的端口,以下的端口都已經(jīng)設(shè)定功能。
    ??? ??? 協(xié)議:為了進(jìn)行網(wǎng)絡(luò)中的數(shù)據(jù)交換而建立的約定,協(xié)議是為了保證通信的安全,不同層的協(xié)議是完全不同的。
    ??? ??? ??? TCP協(xié)議:傳輸層的協(xié)議,重發(fā)一切錯(cuò)誤的信息
    ??? ??? ??? IP協(xié)議:保證地址和主機(jī)一一對(duì)應(yīng)(ip地址+網(wǎng)卡地址)
    ??? ??? ??? ?
    ??? TCP編程:
    ??? ??? TCP是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過TCP協(xié)議傳輸,得到的是一個(gè)順序的無差錯(cuò)的數(shù)據(jù)流。發(fā)送方和接收方的成對(duì)的兩個(gè)socket之間必須建立連接,以便在TCP協(xié)議的基礎(chǔ)上進(jìn)行通信,當(dāng)一個(gè)socket(通常都是server socket)等待建立連接時(shí),另一個(gè)socket可以要求進(jìn)行連接,一旦這兩個(gè)socket連接起來,它們就可以進(jìn)行雙向數(shù)據(jù)傳輸,雙方都可以進(jìn)行發(fā)送或接收操作。
    ??? ??? ??? 1) 服務(wù)器分配一個(gè)端口號(hào),服務(wù)器使用accept()方法等待客戶端的信號(hào),信號(hào)一到打開socket連接,從socket中取得OutputStream和InputStream。
    ??? ?? ??? ??? 2) 客戶端提供主機(jī)地址和端口號(hào)使用socket端口建立連接,得到OutputStream和InputStream。?
    ?
    ??? ??? Server端編碼的步驟:
    ??? ??? ??? 1、new ServerSocket 打開端口
    ??? ??? ??? 2、調(diào)ServerSocket的accept()等待客戶連接,當(dāng)連接成功返回交互的Socket。
    ??? ??? ??? 3、調(diào)用Socket.getInputStream,getOutputStream獲得服務(wù)器端的IO流
    ??? ??? ??? 4、用處理流封裝后與客戶端交互,記住你讀我寫,一讀一寫。
    ??? ??? ??? 5、關(guān)閉單一客戶端調(diào)用Socket的close(),關(guān)閉服務(wù)器調(diào)ServerSocket的close();
    ?
    ??? ??? Socket端編碼步驟:
    ??? ??? ??? 1、new Socket(Server ip,Server port)試圖連接,如成功才有對(duì)象
    ??? ??? ??? 2、調(diào)用Socket.getInputStream,getOutputStream獲得服務(wù)器端的IO流
    ??? ??? ??? 3、用處理流封裝后與客戶端交互,記住你讀我寫,一讀一寫。
    ??? ??? ??? 4、關(guān)閉,只有Socket的close()方法。
    ?
    ??? 網(wǎng)絡(luò)編程:
    ??? 多線程+網(wǎng)絡(luò):
    ??? ??? 1、服務(wù)器端的等待客戶連接代碼( while(true) ),服務(wù)器端與單個(gè)客戶端交互的代碼放入線程體( run )
    ??? ??? 2、客戶端如有其他要求,與服務(wù)器交互的代碼也要放入線程體
    ??? ??? 3、ServerSocket和Socket編碼基于TCP/IP協(xié)議,重發(fā)一切錯(cuò)誤數(shù)據(jù),當(dāng)網(wǎng)絡(luò)不好時(shí)會(huì)使性能很差
    ??? ??? 4、Server端
    ??? ??? ??? new ServerSocket啟動(dòng)等待連接線程
    ??? ??? ??? 在accept后啟動(dòng)交互線程
    ??? ??? 注意:交互時(shí)注意對(duì)應(yīng)產(chǎn)生,讀寫流對(duì)應(yīng)和次數(shù)對(duì)應(yīng)
    ??? ??? ?
    ??? URL:網(wǎng)址,統(tǒng)一資源定位器
    ??? ??? 常用的構(gòu)造器:
    ??? ??? ??? URL(String spec)?
    ??? ??? ??? ??? spec? 一個(gè)完整的網(wǎng)址(協(xié)議+網(wǎng)址)
    ????????? ??? ??? ??? 根據(jù) String 表示形式創(chuàng)建 URL 對(duì)象。
    ????????? ??? ??? ??? ?
    ??? URLConnection:與網(wǎng)址進(jìn)行連接
    ??? ??? 通過URL的openConnection()方法生成一個(gè)URLConnection實(shí)例,通過下面兩個(gè)方法,進(jìn)行流的操作
    ??? ??? ??? getInputStream()?
    ??? ????????? ??? ??? 返回從此打開的連接讀取的輸入流
    ??? ????????? ??? getOutputStream()?
    ??? ????????? ??? ??? 返回寫入到此連接的輸出流。
    ??? ????????? ??? ??? ?
    ??? UDP編程:這種信息傳輸方式相當(dāng)于傳真,信息打包,在接收端準(zhǔn)備紙
    ??? ??? 特點(diǎn):
    ??? ??? ??? 1、一種無連接協(xié)議,速度快
    ??? ??? ??? 2、不保證數(shù)據(jù)的完整,不會(huì)進(jìn)行重發(fā)
    ??? ??? ??? ?
    ??? ??? DatagramSocket和DatagramPacket類:
    ??? ??? ??? DatagramSocket:此類表示用來發(fā)送和接收數(shù)據(jù)報(bào)包的套接字。
    ??? ??? ??? DatagramPacket:數(shù)據(jù)報(bào)包,是UDP下進(jìn)行傳輸數(shù)據(jù)的單位,數(shù)據(jù)存放在字節(jié)數(shù)組中,其中包括了目標(biāo)地址和端口以及傳送的信息。
    ??? ??? ??? ??? 用于接收:??? ?
    ??? ??? ??? ??? ??? DatagramPacket(byte[] buf , int length)
    ??? ??? ??? ??? 用于發(fā)送:??? ?
    ??? ??? ??? ??? ??? DatagramPacket(byte[] buf , int length , InetAddress address , int port )
    ??? ??? ??? ??? ??? ?
    ??? ??? UDP發(fā)送端:
    ??? ??? ??? 1、創(chuàng)建一個(gè)DatagramSocket,不需要參數(shù)
    ??? ??? ??? 2、創(chuàng)建一個(gè)DatagramPacket,指明接收方的IP地址和端口號(hào)
    ??? ??? ??? 3、發(fā)送數(shù)據(jù)send(DatagramPacket p)
    ??? ??? ??? 4、關(guān)閉DatagramSocket
    ?
    ??? ??? UDP接收端:
    ??? ??? ??? 1、創(chuàng)建一個(gè)DatagramSocket,指定接收方的IP地址和端口號(hào)
    ??? ??? ??? 2、創(chuàng)建一個(gè)DatagramPacket,不需要IP地址和端口號(hào)
    ??? ??? ??? 3、接收數(shù)據(jù)receive(DatagramPacket p)
    ??? ??? ??? 4、關(guān)閉DatagramSocket
    ??? ??? ??? ?
    常用類庫(kù):
    ??? java.lang.*:
    ??? ??? System 系統(tǒng)
    ??? ??? Object 對(duì)象
    ??? ??? ??? clone()
    ??? ??? ??? equals()
    ??? ??? ??? hashCode()
    ??? ??? ??? toString()
    ??? ??? Class? 類??? ??? ??? ?
    ??? ??? String/StringBuffer/StringBuilder? 與字符串相關(guān)的
    ??? ??? Thread 線程
    ??? ??? 所有的封裝類
    ?
    ??? java.util.*:
    ??? ??? Set--->HashSet,TreeSet??? ???
    ??? ??? List--->ArrayList??? ?
    ??? ??? Map--->HashMap(線程安全,不支持空),HashTable(線程不安全,支持空)
    ??? ??? Collections--->外同步
    ??? ??? Properties
    ??? ??? Date
    ??? ??? 觀察者-->Observable,接口Observer
    ??? ??? 數(shù)據(jù)結(jié)構(gòu)+工具類
    ?
    ??? java.sql.*: 后面馬上會(huì)講到,JDBC
    ??? ?
    ??? java.awt/swing.*:沒什么機(jī)會(huì)用到
    ??? ??? ?
    ??? java.io.*:? 流相當(dāng)?shù)亩?
    ??? ??? File/FilenameFilter
    ??? ??? Serializable 對(duì)象序列化接口
    ?
    ??? ??? ??? 注意:寫一個(gè)類要考慮的事情:1、無參構(gòu)造器,2、實(shí)現(xiàn)序列化接口,3、重寫equals,hashCode
    ??? ??? ?
    ??? ??? FileInputStream
    ??? ??? FileOutputStream
    ??? ??? InputStreamReader
    ??? ??? PrintStream
    ??? ??? BufferedReader
    ??? ??? nio包
    ??? ?
    ??? java.net.*:? 以后JSP,Servlet用的時(shí)候這個(gè)包都已經(jīng)寫好了
    ??? ??? InetAddress--->IP地址
    ??? ??? URL----------->網(wǎng)址
    ??? ??? URLConnection---->連接
    ??? ??? ServerSocket,Socket----TCP/IP
    ??? ??? DatagramSocket,DatagramPacket----UDP
    ??? ??? ?
    ??? 一些零散的類:
    ??? ??? Comparable(可比較的),Comparator(比較器)
    ?
    ??? ??? java.math.*;數(shù)字在商業(yè)軟件中應(yīng)用時(shí)找這個(gè)包
    ??? ??? ??? BigDecimal
    ??? ??? ?
    ??? ??? 與反射相關(guān)的:java.lang.reflect:? 用的機(jī)會(huì)比較少
    ??? ??? ??? ??? ??? ?
    ??? ??? Runtime(運(yùn)行環(huán)境),Process(進(jìn)程) ,這兩個(gè)在java.lang包里,用了這些就不能跨平臺(tái)了,而且效率低


    posted on 2009-02-14 23:33 liuliang 閱讀(3738) 評(píng)論(0)  編輯  收藏

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲精品乱码久久久久久| 亚洲成网777777国产精品| 好男人视频社区精品免费| 国产资源免费观看| 久久亚洲国产成人精品无码区| 国产亚洲精品观看91在线| 亚洲成人一级电影| 亚洲AV无码专区亚洲AV桃| gogo免费在线观看| 57pao一国产成永久免费 | 日日狠狠久久偷偷色综合免费| 中文字幕免费人成乱码中国| 国产四虎免费精品视频| 国产精品免费_区二区三区观看| 亚洲熟伦熟女新五十路熟妇| 久久亚洲精品成人av无码网站| 亚洲成aⅴ人片久青草影院按摩| 三年片在线观看免费| 69堂人成无码免费视频果冻传媒 | 亚洲精品无码av天堂| 婷婷精品国产亚洲AV麻豆不片| 精品国产成人亚洲午夜福利| 五月婷婷免费视频| 精品女同一区二区三区免费站| 国产一精品一aⅴ一免费| 无码专区—VA亚洲V天堂| 亚洲国产日韩a在线播放| 成人爽a毛片免费| 免费无码黄网站在线观看| 亚洲国产一二三精品无码| 亚洲色精品三区二区一区| 华人在线精品免费观看| 狠狠久久永久免费观看| 亚洲高清有码中文字| 亚洲蜜芽在线精品一区| 亚洲AV无码XXX麻豆艾秋| 免费视频精品一区二区三区| 国产一级做a爱免费视频| 亚洲午夜成激人情在线影院| 一区二区三区在线免费| 国产福利在线免费|