Java知識學(xué)習(xí)資料筆記課堂記錄_第1頁
Java知識學(xué)習(xí)資料筆記課堂記錄_第2頁
Java知識學(xué)習(xí)資料筆記課堂記錄_第3頁
Java知識學(xué)習(xí)資料筆記課堂記錄_第4頁
Java知識學(xué)習(xí)資料筆記課堂記錄_第5頁
已閱讀5頁,還剩86頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Java筆記91-Java知識學(xué)習(xí)資料筆記課堂記錄java概述1.1java發(fā)展簡史及jdk版本1982年成立了sun公司(StanfordUniversityNetWork),應(yīng)用于小型機等服務(wù)器領(lǐng)域的開發(fā)。Oak1995年jdk1.01998年jdk2.01999年javaee標準推出Java5.0Java6.02009年oracle收購了sunSolaris(unix)MySql1.2java技術(shù)特點1.開源簡單易用純面向?qū)ο罂缙脚_性Java虛擬機ForlinuxForwindows.class文件java(Java虛擬機中的一個命令)->.class->邊解釋邊運行Java程序與操作系統(tǒng)之間的一個紐帶Java普遍被認為是”一次編譯,隨處運行”。程序代碼中不要出現(xiàn)過分依賴某種操作系統(tǒng)特征的代碼垃圾回收機制1.3jdk下載與安裝1.2.安裝3.配置環(huán)境變量Path環(huán)境變量中追加一段“C:\ProgramFiles\Java\jdk1.6.0_18\bin”,注意一定要指到bin下4.運行javac,進入命令提示選項即可1.4環(huán)境變量的說明(PATH)1.首先會在當(dāng)前目錄尋找該命令2.如果找不到,會在系統(tǒng)環(huán)境變量中尋找有無指向該命令的路徑3.如果找不到,會在用戶環(huán)境變量中尋找有無指向該命令的路徑4.如果找不到,提示錯誤1.5第一個Java運行程序classHelloWorld{publicstaticvoidmain(String[]args){System.out.println("這是第一個應(yīng)用程序!");}}詳解過程cmd命令行定位到應(yīng)用程序源文件所在目錄下javac編譯應(yīng)用程序源文件javac–verbose顯示詳細的編譯過程當(dāng)前目錄下生成字節(jié)碼文件HelloWorld.classjava執(zhí)行應(yīng)用程序java–verbose顯示詳細的執(zhí)行過程編譯:源文件->字節(jié)碼指令執(zhí)行:字節(jié)碼指令裝入內(nèi)存,字節(jié)碼校驗器對其進行校驗,引用到的相關(guān)的類的字節(jié)碼被裝入,找到應(yīng)用程序入口(main),程序執(zhí)行。1.6Java編碼約定Person1.類名遵守駝峰標識對于合成單詞,每個單詞首字母大寫2.對于方法首字母小寫helloWorld()3.package所有的字母全部小寫4.成員變量與方法命名一致5.局部變量與方法命名一致6.見名知意2.基礎(chǔ)語法2.1直接量和變量Char型表示Unidcode字符集100010001111111188FF00012DFF014E中88FF2.2基本數(shù)據(jù)類型轉(zhuǎn)化對于整數(shù)直接量默認為int型對于小數(shù)直接量默認為double型byte/short/char->int->long->float->doublebyte/short/char之間不互相轉(zhuǎn)換,它們在運算時都會轉(zhuǎn)換為int表數(shù)范圍大的類型轉(zhuǎn)換為表數(shù)范圍小的數(shù)據(jù)類型時,需要進行強制類型轉(zhuǎn)換多種類型的數(shù)據(jù)混合運算時,會自動將所有類型轉(zhuǎn)換為最大表數(shù)范圍的那種類型之后再運算2.3為什么是-124Byteb=122;Byteb2=10;Byteb3=b+b2;B3=-124????原碼反碼補碼

正數(shù)原=反=補

負數(shù)補=原碼除符號位各位取反+1001111010000010101000010000132011111100100000111000010012210132轉(zhuǎn)為byte高三位全部舍棄-124各位取反+12.4取某一位的值或者設(shè)置某一位的值一個整數(shù),要取某一位的值為0或為1將該整數(shù)與1左移目標位后作&運算,如果結(jié)果為0,則表明該位為0,否則為1如1200001100判斷第2位的值為1還是0000000011<<2000001001<<2&1200000100最終結(jié)果不為0則12的第2位為1一個整數(shù),要將某一位設(shè)置為1將該整數(shù)與1左移目標位后作|運算即可如12 00001100設(shè)置第2位的值為1分析:既要保持該整數(shù)各位不變,又要將目標位設(shè)置為1,目標位只可能為0或1,要將目標位設(shè)置為1,則只需要將該整數(shù)與目標位為1,其它位為0的一個數(shù)作|運算000000011<<20000010012|1<<200000101最終結(jié)果,將12的第2位設(shè)置為1一個整數(shù),要將某一位設(shè)置為0將該整數(shù)與1左移目標位后取反作&運算即可如12 00001100設(shè)置第2位的值為0分析:既要保持該整數(shù)各位不變,又要將目標位設(shè)置為0,目標位只可能為0或1,要想得到結(jié)果,選取可能參與運算的數(shù)應(yīng)為目標位為0,其它各位為1,且兩個操作數(shù)作&運算000000011<<200000100~1<<21111101112&~1<<200001000最終結(jié)果,將12的第2位設(shè)置為02.5包及Classpath通常情況下,需要對應(yīng)用程序中的類打包包的劃分的幾種方式*按照功能模塊劃分*按照程序架構(gòu)劃分org.leadfar.java.system.TestPackagejavac–d.TestPackage.java運行編譯后的TestPackage,要寫全類路徑如果在其它盤符下也想運行TestPackage設(shè)置classpath=.;d:\xxxx\xxx;黑窗口中設(shè)置的只在當(dāng)前會話有效Java–classpathd:\xxx\xxxorg.leadfar.java.system.TestPackageJava–Duser.dir=d:\xxx\xxxorg.leadfar.java.system.TestPackage2.6類的裝載1.啟動類裝載器純的C語言編寫的jre/lib/rt.jar2.擴展類裝載器java編寫的C:\ProgramFiles\Java\jdk1.6.0_18\jre\lib\ext3.類路徑類裝載器指classpath指定的類路徑3.面向?qū)ο?.1編程語言發(fā)展1.機器語言2.匯編語言3.高級語言CC++3.5java面向?qū)ο蟮恼Z言4.自然語言sql語句Select*fromt_user;3.2面向過程與面向?qū)ο箢愂欠褐笇ο笫蔷唧w夢中情人:身高體重膚色性格洗衣服()做飯()按摩()張三:My夢中情人身高:170體重:120膚色:”白”性格:“溫柔”classLover{intheight;intweight;Stringskin;StringCharacter;voidwash(){}voidcook(){}voidanmo(){ }}3.3類與對象3.3.1依賴關(guān)系*一對一人與身份證*一對多人與車*多對多人與興趣從語意角度分析繼承關(guān)系(什么是什么的一種)學(xué)生與人的關(guān)系3.3.2Private:只能在類的內(nèi)部訪問Public:隨時隨地都可以訪問Package(什么也不寫):僅在某個包中能訪問Protected:受保護的,可以在同一個包中被訪問到,對于不同的包如果存在繼承關(guān)系,則可以訪問Private->package->protected->public清一色的采用public雖然也可以實現(xiàn)開發(fā)但是盡可能的權(quán)限越嚴格越好關(guān)于protected的實驗父類:AnimalproetecedStringname=””;子類:Dog能夠繼承protected的成員變量3.3.3a1.所有的成員變量均需要設(shè)置為對外不可見2.提供一組public的setters和getters完成對成員變量的讀寫3.成員變量就是attribute4.而setters和getters決定的名稱為Property(就是去掉set部分后單詞首字母小寫后的名稱)5.再次強調(diào)編碼約定3.3.4運行時內(nèi)存分布狀況1.java棧(stack):存放局部變量,一個方法開辟一個棧幀2.堆(heap):存放引用類型的對象3.方法區(qū)(methodarea):存放字符串常量和靜態(tài)變量4.PC寄存器:存放指令執(zhí)行到哪一條Personp=newPerson()1.java棧中為main方法開辟新的棧幀2.Java棧中存放局部變量p,此時p的值為空3.等式右邊產(chǎn)生新的對象,在堆內(nèi)存中分配Person對象的地址,同步成員變量賦初值4.將對象的地址賦值給局部變量p5.main方法執(zhí)行完,棧幀彈出6.在某一時刻,堆內(nèi)存中的對象被垃圾回收器回收publicstaticvoidmain(String[]args){ Lineline=newLine();line.setStartPoint(1,2);line.setEndPoint(3,4);Strings1=line.printStartPoint();System.out.println(s1);Strings2=line.printEndPoint();System.out.println(s2); }棧棧堆方法區(qū)Args:????Line:0x00001Start:????End:????X:1Y:2p1xValue:1yValue:2Xvalue:3yValue:4s1“起點是1,2”“終點是3,4”s23.3.5值傳遞的原則packageorg.leadfar;publicclassMethodClient{ publicvoidcallMethod(inti){ System.out.println(i); i=20; } publicvoidcallDog(Dogd){ System.out.println(d.getAge()); //Dogdog=newDog(); //dog.setAge(5); d.setAge(5); } publicvoidcallDog2(Dogd){ d=newDog(); d.setAge(5); } publicstaticvoidmain(String[]args){ MethodClientmc=newMethodClient(); inta=100; //第一種實驗結(jié)論:傳入的參數(shù)在方法內(nèi)部的變化不影響調(diào)用環(huán)境 //對于基本數(shù)據(jù)類型的參數(shù),傳入不影響調(diào)用環(huán)境 //值傳遞 mc.callMethod(a); System.out.println("a="+a); //第二種:傳入的參數(shù)在方法內(nèi)部的變化影響調(diào)用環(huán)境 //對于引用類型,傳入影響調(diào)用環(huán)境 //引用傳遞 Dogd=newDog(); d.setAge(1); //但是,由于引用傳遞傳的是地址,而地址本身就是一個值,所有從本質(zhì)上講,java遵循的都是值傳遞原則 mc.callDog(d); System.out.println("d.age="+d.getAge()); }}3.3.6轉(zhuǎn)型與多態(tài)三個基本條件:要有繼承關(guān)系,子類需要重寫父類方法,父類引用指向子類對象package.leadfar;classA{ publicvoidm1(){ System.out.println("A.m1()被調(diào)用了"); } publicvoidm2(){ System.out.println("A.m2()被調(diào)用了"); m1(); }}classBextendsA{ publicvoidm1(){ System.out.println("B.m1()被調(diào)用了"); } publicvoidm3(){ System.out.println("B.m3()被調(diào)用了"); }}publicclassC{ publicstaticvoidmain(String[]args){ Aa=newB();//父類引用指向字類對象 a.m2();//調(diào)用子類重寫的方法 C.callMethod(a);實際對象為B類型 } StaticvoidcallMethod(Aa){ if(ainstanceofB){//判斷如果為B類型,則可以執(zhí)行instanceof是為了解決非B類型對象非法傳入 Bb=(B)a; b.m3(); b.m2(); } }}3.3.7對象構(gòu)造過程Dogd=newDog();靜態(tài)變量或靜態(tài)代碼塊執(zhí)行(依次執(zhí)行類繼承樹由根到子的靜態(tài)變量或靜態(tài)代碼塊)調(diào)用Dog類的構(gòu)造方法,在構(gòu)造方法里第一句調(diào)用父類的構(gòu)造方法,直到父類到根在根里成員變量默認初始化在根里成員變量顯示初始化在根里執(zhí)行構(gòu)造方法中的代碼–Object的對象父親的成員變量默認初始化父親的成員變量顯示初始化父親構(gòu)造方法中的代碼-Animal的對象自己的成員變量默認初始化自己的成員變量顯示初始化自己構(gòu)造方中的代碼-Dog對象d產(chǎn)生this,super結(jié)論:構(gòu)造方法中一定要存在super調(diào)用,,無論是直接的還是間接的super,this調(diào)用只能出現(xiàn)在構(gòu)造方法的第一句super與this()不能出現(xiàn)在一起3.4Eclipse的使用選擇一個java工程起工程名,點擊ConfigureJREs引入jdk定位到j(luò)dk的根路徑選擇jdk設(shè)置快捷提示如果”.”不提示Ctrl+shift+o導(dǎo)入代碼中需要引入的包Ctrl_shif+f代碼格式化3.5接口1.接口存在的意義:就是為了實現(xiàn)多繼承,更多的是為了擴展,,以不變應(yīng)萬變2.接口是未實現(xiàn)的方法與常量值的集合3.多個無關(guān)的類可以實現(xiàn)同一個接口4.一個類可以實現(xiàn)多個無關(guān)的接口5.與繼承關(guān)系類似接口與實現(xiàn)類之間存在多態(tài)6.接口之間可以繼承7.接口中定義的常量publicstaticfinal這種3.6抽象類1.用abstract關(guān)鍵字修飾的一個類,這個類叫做抽象類,用abstract修飾的一個方法叫做抽象方法.2.含有抽象方法的類必須聲明為抽象類,抽象類必須被繼承后才能使用,抽象方法必須被子類重寫3.如果重寫不了,則將該類聲明為抽象的4.抽象類不能被實例化5.抽象方法只需聲明,不需要實現(xiàn)6.抽象類中可以包含非抽象的方法3.7總結(jié)對象包括什么?狀態(tài)行為什么是抽象?類包括什么?FieldMethod如何通過類創(chuàng)建一個對象?用new關(guān)鍵字創(chuàng)建對象有哪幾種可見性?它們分別表示什么意思?Attribute/property之間的區(qū)別是什么?Attribute一般定義為什么樣的可見性?如果在一個類中,要用到另外一個包中的類,必須?用import語句來引入那個類實例變量與類變量的區(qū)別是什么?實例變量與類變量的初始化值?理解堆、方法區(qū)、棧的區(qū)別理解方法調(diào)用的時候,值傳遞原則方法調(diào)用的過程,其內(nèi)存如何變化?什么是方法的重載?對象轉(zhuǎn)型向上轉(zhuǎn)型向下轉(zhuǎn)型(注意其中的風(fēng)險)override–方法重寫(覆蓋)子類覆蓋(重寫)了父類的方法多態(tài)子類繼承了父類父類的引用指向了子類的對象子類的方法重寫了父類的方法我們通過父類的引用去調(diào)用那些被重寫的方法,虛擬機將在運行的時候確定調(diào)用的究竟是哪個方法,是哪個子類的方法(同一個方法調(diào)用,有可能調(diào)用的真正方法不一樣,產(chǎn)生了多態(tài)性)構(gòu)造方法構(gòu)造方法可以重載子類的構(gòu)造方法必需先調(diào)用父類的構(gòu)造方法如果沒有在子類中顯式添加調(diào)用父類的構(gòu)造方法,編譯器將默認添加一個調(diào)用,以調(diào)用父類的無參構(gòu)造方法this是動態(tài)綁定的private方法和static方法是靜態(tài)綁定的super調(diào)用是靜態(tài)綁定的類的初始化過程finalize()方法與垃圾回收final關(guān)鍵字接口與抽象類Object類中可被重寫的方法equals–注意理解equals和==的區(qū)別hashCodetoStringcloneJDK1.5以后版本的新語法可變參數(shù)的方法(String…)增強的for循環(huán)for(Strings:someStr){}靜態(tài)導(dǎo)入異常4.1異常的分類Erorr系統(tǒng)錯誤,往往是虛擬機報出的系統(tǒng)級錯誤ExceptionCheckedexception必須處理Exception及其子類(RuntimeException除外),在編譯期就需要處理Uncheckedexception運行時可能發(fā)生的異常,不一定需要處理RuntimeException及其子類4.2異常處理Try{}catch(Exceoption1e1){//出現(xiàn)Exception1時的處理代碼}catch(Exceptione2){//出現(xiàn)Exception2時的處理代碼}finaly{\//關(guān)閉或銷毀資源}對于無法處理的異常,可以向外拋出方法定義時throwsException1,Exception2程序中可以用thrownewException1(“aaa”)拋出異常原則:捕獲時先捕獲小異常再捕獲大異??梢杂么螽惓L娲‘惓?,但是不建議這么做4.3重寫方法時異常處理總結(jié),重寫方法需要拋出如果父類(接口)沒聲明拋出異常不聲明拋出異常聲明拋出任意RuntimeException如果父類(接口)聲明拋出checkedexception與原方法所聲明拋出類型一致的異常子異常不聲明拋出異常聲明拋出任意RuntimeException如果父類(接口)聲明拋出uncheckedexception不聲明拋出異常聲明拋出任意RuntimeException集合5.1數(shù)組A[0]A[1]A[2]A[3]A[0]123A[1]5678A[2]A[3]1、Arrays.binarySearch()必須先排序,他返回的是一個int類型的數(shù)字。代表要查找的元素在數(shù)組中的索引值。2、Arrays.copyOf(a,intb).其中a代表要拷貝的數(shù)組,b代表要拷貝多少個3、Arrays.toString()將數(shù)組元素一一打印出來4、Arrays.copyOfRange(a,1,3)a代表數(shù)組名稱。1:代表從索引為1的位置開始拷貝,且包括該位置。3:代表拷貝到的位置,但是不包括該位置。5、Arrays.fill(a,12).a:代表填充數(shù)組的名稱,12:代表用什么填充數(shù)組中的每一個元素5.2集合5.2.1常用集合類CollectionCollectionListSetArrayListLinkedListHashSetMapHashMapPropertiesTreeMapHashTableLinkedHashMap5.2.2HashMap存儲解釋1.當(dāng)添加一個對象時,通過該對象的HashCode計算出應(yīng)該存儲的數(shù)組位置的下標publicVput(Kkey,Vvalue){if(key==null)returnputForNullKey(value);inthash=hash(key.hashCode());//返回數(shù)組中的下標inti=indexFor(hash,table.length);for(Entry<K,V>e=table[i];e!=null;e=e.next){Objectk;if(e.hash==hash&&((k=e.key)==key||key.equals(k))){VoldValue=e.value;e.value=value;e.recordAccess(this);returnoldValue;}}modCount++;addEntry(hash,key,value,i);returnnull;}2.尋找到數(shù)組中計算出的下標的位置,將對象引用存放在數(shù)組中3.如果超過當(dāng)前數(shù)組長度(初始為16)的裝載因子(0.75)后,則擴大一倍數(shù)組(32)4.采用這種存儲方式,取元素性能極高 取時,通過對象的HashCode()計算出該對象應(yīng)該在數(shù)組的位置,直接通過下標索引取得,當(dāng)然,如果該位置存在有多個對象組成的鏈表,則在確定該位置后依次遍歷,所以說,為了減少鏈表的遍歷的時間開銷,數(shù)組越散越好,最好做到一個數(shù)組位置唯一確定一個對象。5.2.3Map1.加入字符串這種類型以字符串作為key,由于字符串本身重寫了HashCode和equals,所以可見的字符串只要相等就會與Map中的存在的關(guān)鍵字沖突,后者會覆蓋前者2.如果引用類型作為key,且重寫了HashCode和equalse方法,則根據(jù)重寫的規(guī)則判斷是否沖突,是否后者覆蓋前者 Mapmap=newHashMap();map.put(newPerson(1,"張1"),newPerson(1,"張1")); map.put(newPerson(2,"張2"),newPerson(2,"張2")); map.put(newPerson(3,"張3"),newPerson(3,"張3")); p=(Person)(map.get(newPerson(1,"張1")));//通過HashCode()和equals(),如果重寫了,能取出,不重寫,取不出 System.out.println(p.getId()+"_"+p.getName());5.2.4Map示例解析personspersons111112222cqbmyjsbmyj“流氓”“小馬哥”反射機制初步6.1Class實例化1.通過實例生成Class實例Strings="abc";Classclazz=s.getClass();2.通過類名生成Class實例Classclazz=String.classClassclazz=java.util.Date.class3.通過Class.forname()Classclazz=Class.forName("java.util.Date");6.2通過Class創(chuàng)建對象實例 Strings="org.leadfar.Person"; try{ Classclazz=Class.forName(s); Personp=(Person)clazz.newInstance();//實際上是在調(diào)用Person的無參的構(gòu)造器 p.setId(1); p.setName("張三"); p.setSex("男"); p.setBirthday(newDate()); System.out.println(p); }catch(ClassNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(InstantiationExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IllegalAccessExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } 6.3通過反射取得其成員1.取方法getMethods()//取得所有的方法,包括繼承的父類的方法,不包括非public的getDeclaredMethods()//取得本類中所有的方法,不包括繼承的父類的方法getMethod(String,Class…)//取得指定的方法,傳遞方法名稱及參數(shù)類型,包括繼承的方法getDeclaredMethod(String,Class…)//取得指定的方法,傳遞方法名稱及參數(shù)類型,包括繼承的方法,不包括繼承方法針對Method對象取各種值MethodsetSexMethod=clazz.getDeclaredMethod("setSex",String.class); System.out.println("方法名稱:"+setSexMethod.getName()); System.out.println("修飾符:"+Modifier.toString(setSexMethod.getModifiers())); System.out.println("參數(shù)類型:"); Class[]clazzs=setSexMethod.getParameterTypes(); for(inti=0;i<clazzs.length;i++){ System.out.println(clazzs[i].getName()); } System.out.println("返回類型:"+setSexMethod.getReturnType().getName());2.取構(gòu)造器及取字段與上類似3.方法調(diào)用Strings="org.leadfar.Person"; Classclazz=Class.forName(s); Personp=(Person)clazz.newInstance(); Methodm=clazz.getMethod("setId",int.class); m.invoke(p,10); Methodm1=clazz.getDeclaredMethod("m1"); m1.setAccessible(true);//設(shè)置可見 m1.invoke(p); System.out.println(p);流7.1基本流類四大基類:InputStream/outputStream/Reader/Writer字節(jié)流:以字節(jié)為基本單元讀入或?qū)懗?InputStream/outputStream字符流:以字符為基本單元讀入或?qū)懗?Reader/Writer7.2原始流類針對不同的數(shù)據(jù)源直接作用于數(shù)據(jù)源的流,又稱節(jié)點流FileInputStream/FileOutputStream–把文件當(dāng)數(shù)據(jù)源ByteArrayInputStream/ByteArrayOutputStream-把byte[]當(dāng)數(shù)據(jù)源StringReader/StringWriter–把String當(dāng)數(shù)據(jù)源CharArrayReader/CharArrayWriter–把char[]當(dāng)數(shù)據(jù)源FileReader/FileWriter–把文件當(dāng)數(shù)據(jù)源的Reader/Writer數(shù)據(jù)源字節(jié)流字符流文件FileInputStreamFileOutputStreamFileReaderFileWriter字節(jié)數(shù)組ByteArrayInputStreamByteArrayOutputStreamStringStringReaderStringWriter字符數(shù)組CharArrayReaderCharArrayWriter原始流類的典型特征是:其構(gòu)造方法就是用數(shù)據(jù)源作為參數(shù)!FileInputStream/FileOutputStream一般用于操作二進制文件,如影像文件,圖片,doc,excel所有存在某種格式的文件FileReader/FileWriter一般用于操作文本文件7.3Decrator設(shè)計模式可以靈活組合多種功能的實現(xiàn),最典型的特征的是構(gòu)造對象時傳入另外一種功能的對象。ss"abcdefhgijkl"shStringHandlersh03DeleteBlankHandlerTrimStringHandlerWshWsh7.4包裝流(處理流)為了不同的目的,而對原始流進行包裝的類,稱為包裝流(WrapperStream),有的地方叫“處理流”WrapperStream相關(guān)的類,典型的特征是:其構(gòu)造方法是以InputStream/OutputStream/Reader/Writer作為參數(shù)的,由此可知,WrapperStream必定持有對另外一個流對象的引用!這另外一個流對象,有可能是原始流對象,也有可能是另外一個包裝流對象,這樣就會形成層層包裝,每一層包裝都完成它自己該完成的功能緩沖流:BufferedInputStream/BufferedOutputStream/BufferedReader/BufferedWriter打印流:PrintStreamPrintWriter數(shù)據(jù)流:DataInputStreamDataOutputStream對象流:ObjectInputStreamObjectOutputStream轉(zhuǎn)化流:InputStreamReaderOutputStreamWriter7.5對象序列化如果對象需要序列化,則需要實現(xiàn)Serializable接口序列化時調(diào)用ObjectOutputStream.writeObject();反序列化時調(diào)用ObjectInputStream.readObject();如果你不想序列化某個屬性,則用transient修飾序列化后,如果類發(fā)生了變化,則不能夠反序列化反序列化時,不調(diào)用類的構(gòu)造方法如果你確實想類發(fā)生了變化,還想反序列化成功,加入PrivatestaticfinallongseriaVersionUID=1L線程8.1創(chuàng)建線程1.繼承Threadpackageorg.leadfar;publicclassMyThreadextendsThread{ @Override publicvoidrun(){ for(inti=0;i<1000;i++){ System.out.println("myThread:"+i); } } publicstaticvoidmain(String[]args){ Threadt=newMyThread(); t.start();//線程啟動,這個線程準備好了,等待jvm的調(diào)用(jvm的時間片的分配) for(inti=0;i<1000;i++){ System.out.println("main:"+i); } } }2.實現(xiàn)Runnablepackageorg.leadfar;publicclassMyThread02implementsRunnable{ @Override publicvoidrun(){ for(inti=0;i<1000;i++){ System.out.println("myThread02:"+i); } } publicstaticvoidmain(String[]args){ Runnabler=newMyThread02(); Threadt=newThread(r); t.start(); for(inti=0;i<1000;i++){ System.out.println("main:"+i); } }}8.2線程命名1.繼承Thread類增加構(gòu)造方法publicMyThread06(Stringname){ super(name);//一定要加 }2.實現(xiàn)Runnable接口Runnabler=newMyThread04(); Threadt=newThread(r,"輔線程1");t.start();8.3線程控制方法說明isAlive()判斷線程是否還“活”著,即線程是否還未終止。getPriority()獲得線程的優(yōu)先級數(shù)值setPriority()設(shè)置線程的優(yōu)先級數(shù)值Thread.sleep()將當(dāng)前線程睡眠指定毫秒數(shù)join()調(diào)用某線程的該方法,將當(dāng)前線程與該線程“合并”,即等待該線程結(jié)束,再恢復(fù)當(dāng)前線程的運行。Thread.yield()讓步,即暗示我的工作做的差不多了,可以讓出CPU,其它線程可以使用它了,但不絕對,沒有什么機制能夠保證這一點。wait()當(dāng)前線程進入對象的waitpool。notify()/notifyAll()喚醒對象的waitpool中的一個/所有等待線程。Thread.currentThread()得到當(dāng)前線程對象8.4線程同步1.Sychonized可以修飾方法,代碼塊2.盡可能的去修飾代碼塊,讓其同步的代碼的粒度越細越好3.Sychonized修飾的代碼塊,一旦一個線程介入,自動擁有該方法所在對象上的一把鎖,并且對這塊代碼塊加鎖,加鎖后,其它線程只有等到該鎖釋放,才可介入.4.當(dāng)一個類中有一個Sychonized方法或代碼塊被加鎖后,則其它的方法或代碼塊都得不到執(zhí)行。5.鎖是加到對象上的,而且一個對象永遠只有一把鎖.6.對于靜態(tài)方法加鎖不是加在代碼所在的對象上,而是加在與之對應(yīng)的Class類型的對象上。8.5死鎖packageorg.leadfar;publicclassDeadLockextendsThread{ privatestaticObjecto1=newObject(); privatestaticObjecto2=newObject(); privatebooleanflag=false; publicDeadLock(booleanflag){ this.flag=flag; } @Override publicvoidrun(){ if(flag){ synchronized(o1){ try{ Thread.sleep(1000); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } synchronized(o2){ System.out.println("11111111111111111111111111111111"); } } }else{ synchronized(o2){ try{ Thread.sleep(1000); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } synchronized(o1){ System.out.println("22222222222222222222222222222222222222"); } } } } publicstaticvoidmain(String[]args){ newDeadLock(true).start();//先o1后o2 newDeadLock(false).start();//先o2后o1 }}8.6線程協(xié)作Wait():進入等待區(qū),釋放鎖Wail(1000):進入等待區(qū),釋放鎖,1000ms后被喚醒Notify():喚醒等待區(qū)的某一個線程NotifyAll():喚醒等待區(qū)中所有的線程10網(wǎng)絡(luò)編程TCP編程–面向連接、可靠發(fā)送數(shù)據(jù)時,需建立連接服務(wù)器端通過ServerSocket(需指定端口來創(chuàng)建)來accept客戶端的Socket客戶端通過創(chuàng)建Socket(需指定服務(wù)器地址以及服務(wù)器的端口)來跟服務(wù)器建立連接一旦客戶端與服務(wù)器建立連接,服務(wù)器端即可得到一個Socket對象,這個Socket對象負責(zé)和客戶端的Socket對象進行通信服務(wù)器端和客戶端均可通過Socket的getInputStream和getOutputStream來接收及發(fā)送數(shù)據(jù)可在服務(wù)器端針對每一個客戶端連接的Socket對象,創(chuàng)建一個線程去處理System.in用于接收控制臺輸入UDP編程–非面向連接,不可靠發(fā)送方創(chuàng)建DatagramSocket對象(可指定發(fā)送端口)發(fā)送方創(chuàng)建DatagramPacket對象,這是一個數(shù)據(jù)包,在創(chuàng)建這個對象的時候,需指定這個數(shù)據(jù)包所包含的數(shù)據(jù)這個數(shù)據(jù)包要發(fā)送到哪臺機器(即目標機器地址),或者指定發(fā)送到整個局域網(wǎng)(網(wǎng)絡(luò)廣播)這個數(shù)據(jù)包要發(fā)送到目標機器的哪個端口發(fā)送方調(diào)用DatagramSocket對象的send方法將數(shù)據(jù)包發(fā)送出去接收方也是創(chuàng)建DatagramSocket對象(指定要從哪個端口接收數(shù)據(jù),應(yīng)與發(fā)送方創(chuàng)建的數(shù)據(jù)包中指定的端口一致)接收方創(chuàng)建DatagramPacket對象(需指定一個內(nèi)存緩沖區(qū),即byte[]數(shù)組)接收方調(diào)用DatagramSocket對象的receive方法,將接收到的數(shù)據(jù)存入DatagramPacket接收方從DatagramPacket中取出數(shù)據(jù)11GUI11.1GUIGraphicalUserInterfaceAWT(抽象窗口工具集)AbstractWindowToolkit為簡單的applet程序設(shè)計AWT沒有提供足夠的桌面端的程序所需的特性它不適宜用來構(gòu)建豐富的桌面圖形界面SwingSwing是AWT的擴展和功能加強是構(gòu)建java圖形界面標準的APISWT(StandardWidgetToolkit)是一個開源的GUI編程框架SWT是IBM為它的Eclipse集成開發(fā)環(huán)境而開發(fā)的圖形用戶界面工具11.2AWTAWT(AbstractWindowToolkit)包括了很多類和接口,用于JavaApplication的GUI(GraphicsUserInterface圖形用戶界面)編程。GUI的各種元素(如:窗口,按鈕,文本框等)由Java類來實現(xiàn)。使用AWT所涉及的類一般在java.awt包及其子包中。11.3Component&ContainerJava的圖形用戶界面的最基本組成部分是Component,Component類及其子類的對象用來描述以圖形化的方式顯示在屏幕上并能與用戶進行交互的GUI元素,例如,一個按鈕,一個標簽等。一般的Component對象不能獨立地顯示出來,必須將“放在”某一的Container對象中才可以顯示出來。Container是Component子類,Container子類對象可以“容納”別的Component對象。Container對象可使用方法add(..)向其中添加其他Component對象。Containter是Component的子類,因此Containter對象也可以被當(dāng)作Component對象添加到其他Container對象中。有兩種常用的Containter:Window:其對象表示自由停泊的頂級窗口Panel:其對象可作為容納其它Component對象,但不能獨立存在,必須被添加到其它Containner中(如Window或Applet)11.4FrameFrame是Window的子類,由Frame或其子類創(chuàng)建的對象為一個窗體。Frame的常用構(gòu)造方法:Frame()Frame(Strings)創(chuàng)建標題欄為字符串s的窗口。Frame的常用設(shè)置方法setBounds(intx,inty,intwidth,intheight)設(shè)置窗體位置和大小,x,y是左上角坐標,

widht和height是寬度和高度setSize(intwidth,intheight)設(shè)置窗體的位置,x,y是左上角坐標setLocation(intx,inty)設(shè)置窗體的大小,widht和height分別是寬度和高度。setBackground(Colorc)設(shè)置背景顏色,參數(shù)為Color對象。setVisible(booleanb)設(shè)置是否可見。setTitle(Stringname)StringgetTitle()setResizable(booleanb)設(shè)置是否可以調(diào)整大小。示例代碼11.4-1:基本窗口顯示importjava.awt.*;classTestFrame{ publicstaticvoidmain(Stringargs[]){ Framef=newFrame("MyFirstTest"); f.setLocation(300,300); f.setSize(170,100); f.setBackground(Color.blue); f.setResizable(false); f.setVisible(true); }}示例代碼11.4-2:顯示多個不同背景色的窗口importjava.awt.*;classTestMultiFrame{publicstaticvoidmain(Stringargs[]){MyFramef1=newMyFrame(100,100,200,200,Color.BLUE);MyFramef2=newMyFrame(300,100,200,200,Color.YELLOW);MyFramef3=newMyFrame(100,300,200,200,Color.GREEN);MyFramef4=newMyFrame(300,300,200,200,Color.MAGENTA);}}classMyFrameextendsFrame{staticintid=0;MyFrame(intx,inty,intw,inth,Colorcolor){super("MyFrame"+(++id));setBackground(color);setLayout(null);setBounds(x,y,w,h);setVisible(true);}}11.5PanelPanel對象可以看成可以容納Component的空間Panel對象可以擁有自己的布局管理器Panel類擁有從其父類繼承來的setBounds(intx,inty,intwidth,intheight)setSize(intwidth,intheight)setLocation(intx,inty)setBackground(Colorc)setLayout(LayoutManagermgr)等方法。Panel的構(gòu)造方法為:Panel()使用默認的FlowLayout類布局管理器初始化。Panel(LayoutManagerlayout)使用指定的布局管理器初始化。示例代碼11.5-1:importjava.awt.*;classTestPanel{publicstaticvoidmain(Stringargs[]){ Framef=newFrame("JavaFramewithPanel");Panelp=newPanel(null);f.setLayout(null);f.setBounds(300,300,500,500);f.setBackground(newColor(0,0,102));p.setBounds(50,50,400,400);p.setBackground(newColor(204,204,255));f.add(p);f.setVisible(true);}}示例代碼11.5-2:importjava.awt.*;classTest{publicstaticvoidmain(Stringargs[]){newMyFrame2("MyFrameWithPanel",300,300,400,300);}}classMyFrame2extendsFrame{privatePanelp1,p2,p3,p4;MyFrame2(Strings,intx,inty,intw,inth){super(s);setLayout(null);p1=newPanel(null);p2=newPanel(null);p3=newPanel(null);p4=newPanel(null);p1.setBounds(0,0,w/2,h/2);p2.setBounds(0,h/2,w/2,h/2);p3.setBounds(w/2,0,w/2,h/2);p4.setBounds(w/2,h/2,w/2,h/2);p1.setBackground(Color.BLUE);p2.setBackground(Color.WHITE);p3.setBackground(Color.YELLOW);p4.setBackground(Color.RED);add(p1);add(p2);add(p3);add(p4);setBounds(x,y,w,h);setVisible(true);}}11.6布局管理器Java語言中,提供了布局管理器類的對象可以管理,管理Component在Container中的布局,不必直接設(shè)置Component位置和大小。每個Container都有一個布局管理器對象,當(dāng)容器需要對某個組件進行定位或判斷其大小尺寸時,就會調(diào)用其對應(yīng)的布局管理器,調(diào)用Container的setLayout方法改變其布局管理器對象。Awt提供了5種布局管理器類:FlowLayoutBorderLayoutGridLayoutCardLayoutGridBagLayout11.6.1FlowLayoutFlowLayout是Panel類的默認布局管理器。FlowLayout布局管理器對組件逐行定位,行內(nèi)從左到右,一行排滿后換行。不改變組件的大小,按組件原有尺寸顯示組件,可設(shè)置不同的組件間距,行距以及對齊方式。FlowLayout布局管理器默認的對齊方式是居中。FlowLayout的構(gòu)造方法newFlowLayout(FlowLayout.RIGHT,20,40);右對齊,組件之間水平間距20個像素,垂直間距40個像素。newFlowLayout(FlowLayout.LEFT);左對齊,水平和垂直間距為缺省值(5)。newFlowLayout(); 使用缺省的居中對齊方式,水平和垂直間距為缺省值(5)。示例代碼11.6.1-1:importjava.awt.*;classTestFlowLayout{publicstaticvoidmain(Stringargs[]){ Framef=newFrame("FlowLayout");Buttonbutton1=newButton("Ok");Buttonbutton2=newButton("Open");Buttonbutton3=newButton("Close");f.setLayout(newFlowLayout(FlowLayout.CENTER,5,5));f.add(button1);f.add(button2);f.add(button3);f.setSize(100,100);f.setVisible(true);}}示例代碼11.6.1-2:importjava.awt.*;classTestFlowLayout2{publicstaticvoidmain(Stringargs[]){Framef=newFrame("JavaFrame");FlowLayoutl=newFlowLayout(FlowLayout.CENTER,20,40);f.setLayout(l);f.setLocation(300,400);f.setSize(300,200);f.setBackground(newColor(204,204,255));for(inti=1;i<=20;i++){f.add(newButton("BUTTON"));}f.setVisible(true);}}11.6.2BorderLayout布局管理器BorderLayout是Frame類的默認布局管理器。BorderLayout將整個容器的布局劃分成東(EAST)西(WEST)南(SOUTH)北(NORTH)中(CENTER)五個區(qū)域,組件只能被添加到指定的區(qū)域。如不指定組件的加入部位,則默認加入到CENTER區(qū)。每個區(qū)域只能加入一個組件,如加入多個,則先前加入的會被覆蓋。BorderLayout型布局容器尺寸縮放原則:北、南兩個區(qū)域在水平方向縮放。東、西兩個區(qū)域在垂直方向縮放。中部可在兩個方向上縮放。示例代碼11.6.2-1:importjava.awt.*;classTestBorderLayout{ publicstaticvoidmain(Stringargs[]){ Framef; f=newFrame("BorderLayout"); Buttonbn=newButton("BN"); Buttonbs=newButton("BS"); Buttonbw=newButton("BW"); Buttonbe=newButton("BE"); Buttonbc=newButton("BC"); /* f.add(bn,"North"); f.add(bs,"South"); f.add(bw,"West"); f.add(be,"East"); f.add(bc,"Center"); */ //也可使用下述語句 f.add(bn,BorderLayout.NORTH); f.add(bs,BorderLayout.SOUTH); f.add(bw,BorderLayout.WEST); f.add(be,BorderLayout.EAST); f.add(bc,BorderLayout.CENTER); f.setSize(200,200); f.setVisible(true); }}11.6.3GridLayout布局管理器GridLayout型布局管理器將空間劃分成規(guī)則的矩形網(wǎng)格,每個單元格區(qū)域大小相等。組件被添加到每個單元格中,先從左到右添滿一行后換行,再從上到下。在GridLayout構(gòu)造方法中指定分割的行數(shù)和列數(shù):如:GridLayout(3,4)示例代碼11.6.3-1importjava.awt.*;classTestGridLayout{ publicstaticvoidmain(Stringargs[]){Framef=newFrame("GridLayoutExample");Buttonb1=newButton("b1");Buttonb2=newButton("b2");Buttonb3=newButton("b3");Buttonb4=newButton("b4");Buttonb5=newButton("b5");Buttonb6=newButton("b6");f.setLayout(newGridLayout(3,2));f.add(b1);f.add(b2);f.add(b3);f.add(b4);f.add(b5);f.add(b6);f.pack();f.setVisible(true); }}11.6.4綜合練習(xí)使用Container的嵌套實現(xiàn)下面布局importjava.awt.*;classTest{publicstaticvoidmain(Stringargs[]){Framef=newFrame("JavaFrame");f.setLayout(newGridLayout(2,1));f.setLocation(300,400);f.setSize(300,200);f.setBackground(newColor(204,204,255));Panelp1=newPanel(newBorderLayout());Panelp2=newPanel(newBorderLayout());Panelp11=newPanel(newGridLayout(2,1));Panelp21=newPanel(newGridLayout(2,2));p1.add(newButton("BUTTON"),BorderLayout.WEST);p1.add(newButton("BUTTON"),BorderLayout.EAST);p11.add(newButton("BUTTON"));p11.add(newButton("BUTTON"));p1.add(p11,BorderLayout.CENTER);p2.add(newButton("BUTTON"),BorderLayout.WEST);p2.add(newButton("BUTTON"),BorderLayout.EAST);for(inti=1;i<=4;i++){ p21.add(newButton("BUTTON"));}p2.add(p21,BorderLayout.CENTER);f.add(p1);f.add(p2);f.setVisible(true);}}11.6.5小結(jié)Frame是一個頂級窗口,F(xiàn)rame的缺省布局管理器為BorderLayoutPanel無法單獨顯示,必須添加到某個容器中。Panel的缺省布局管理器為FlowLayout。當(dāng)把Panel作為一個組件添加到某個容器中后,該Panel仍然可以有自己的布局管理器。使用布局管理器時,布局管理器負責(zé)各個組件的大小和位置,因此用戶無法在這種情況下設(shè)置組件大小和位置屬性,如果試圖使用Java語言提供的setLocation(),setSize(),setBounds()等方法,則都會被布局管理器覆蓋。如果用戶確實需要親自設(shè)置組件大小或位置,則應(yīng)取消該容器的布局管理器,方法為:setLayout(null)11.7事件監(jiān)聽11.7.1事件監(jiān)聽模型示例代碼11.7-1/* 范例名稱:Java事件處理舉例* 源文件名稱:TestActionEvent.java* 要點:* 1.Java事件處理機制* 2.事件源、事件監(jiān)聽器概念及作用* 3.如何在一個現(xiàn)有組件上注冊監(jiān)聽器*/importjava.awt.*;importjava.awt.event.*;classTestActionEvent{publicstaticvoidmain(Stringargs[]){ Framef=newFrame("Test"); Buttonb=newButton("PressMe!"); Monitorbh=newMonitor(); b.addActionListener(bh); f.add(b,BorderLayout.CENTER); f.pack(); f.setVisible(true);}}classMonitorimplementsActionListener{publicvoidactionPerformed(ActionEvente){ System.out.println(newjava.util.Date(e.getWhen()));System.out.println("abuttonhasbeenpressed");}} 11.7.2TextField類1.java.awt.TextField類用來創(chuàng)建文本框?qū)ο蟆?.TextField有如下常用方法:TextField()TextField(intcolumns)TextField(Stringtext)TextField(Stringtext,intcolumns)publicvoidsetText(Stringt)publicStringgetText()publicvoidsetEditable(booleanb)publicbooleanisEditable()publicvoidsetBackground(Colorc)publicvoidselect(intselectionStart,intselectionEnd)publicvoidselectAll()publicvoidaddActionListener(ActionListenerl)3.TextField事件監(jiān)聽TextField對象可能發(fā)生Action(光標在文本框內(nèi)敲回車)事件。與該事件對應(yīng)的事件類是java.awt.event.ActionEvent。用來處理ActionEvent事件是實現(xiàn)了java.awt.event.ActionListener接口的類的對象。ActionListener接口定義有方法:publicvoidactionPerformed(ActionEvent

e)實現(xiàn)該接口的類要在該方法中添加處理該事件(Action)的語句。使用addActionListener(ActionListenerl)方法為TextField對象注冊一個ActionListener對象,當(dāng)TextField對象發(fā)生Action事件時,會生成一個ActionEvent對象,該對象作為參數(shù)傳遞給ActionListener對象的actionPerformer方法在方法中可以獲取該對象的信息,并做相應(yīng)的處理。示例代碼11.7.2-1importjava.awt.*;importjava.awt.event.*;classTest{ publicstaticvoidmain(String[]args){ newTFFrame(); }}classTFFrameextendsFrame{ TFFrame(){ TextFieldtf=newTextField(); add(tf); tf.addActionListener(newTFActionListener()); pack(); setVisible(true); }}classTFActionListenerimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ TextFieldtf=(TextField)e.getSource(); System.out.println(tf.getText()); tf.setText(""); }}示例代碼11.7.2-2:模擬一個計算器importjava.awt.*;importjava.awt.event.*;classTest{ publicstaticvoidmain(String[]args){ newTFFrame().launchFrame(); }}classTFFrameextendsFrame{ publicvoidlaunchFrame(){ TextFieldnum1=newTextField(10); TextFieldnum2=newTextField(10); TextFieldnum3=newTextField(15); LabellblPlus=newLabel("+"); ButtonbtnEqual=newButton("="); btnEqual.addActionListener(newMonitor(num1,num2,num3)); setLayout(newFlowLayout()); add(num1); add(lblPlus); add(num2); add(btnEqual); add(num3); pack(); setVisible(true); }}classMonitorimplementsActionListener{ TextFieldnum1,num2,num3; publicMonitor(TextFieldnum1,TextFieldnum2,TextFieldnum3){ this.num1=num1; this.num2=num2; this.num3=num3; } publicvoidactionPerformed(ActionEvente){ intn1=Integer.parseInt(num1.getText()); intn2=Integer.parseInt(num2.getText()); intn3=n1+n2; num3.setText(String.valueOf(n3)); }}運行結(jié)果11.7.3Graphics類每個Component都有一個paint(Graphicsg)用于實現(xiàn)繪圖目的,每次重畫該Component時都自動調(diào)用paint方法。Graphics類中提供了許多繪圖方法,如:drawRect(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論