Java2 网络编程基础课件_第1页
Java2 网络编程基础课件_第2页
Java2 网络编程基础课件_第3页
Java2 网络编程基础课件_第4页
Java2 网络编程基础课件_第5页
已阅读5页,还剩308页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java

編程簡介

Java發展史1990年Sun公司的

JamesGosling等人開始開發名稱為

Oak的語言。希望用於控制嵌入在有線電視交換盒、PDA(PersonalDigitalAssistant個人數字助理)、家用電器等的微處理器。

1993年互動式電視和

PDA市場開始滑坡,而

Internet正處於增長時期,因此Sun公司將目標市場轉向

Internet應用程式。1994年將Oak語言更名為Java。(java音譯為“爪哇”,是印尼一個盛產咖啡的島嶼)

1995年正式推出1995年Sun公司的

HotJava流覽器問世。什麼是JavaJava是一種跨平臺的,純面向對象的編程語言。Java

主要應用在基於WEB的程式中。Java在客戶端可用來生成兩類程式:應用程式(Application)、小應用程式(Applet)。Java既是一種編譯執行的語言,也是一種解釋執行的語言。Java的基本特點3-1簡單面向對象分佈式Java的風格類似於C++,因而對C++程式員而言非常容易掌握Java編程技術;Java摒棄了C++中容易引發程式錯誤的地方,如指針操作和記憶體管理;

在Java中任何東西都是對象,是真正純粹面向對象的語言。更有利於編制大型軟體工程Java提供了包容廣泛的例程庫,可處理像HTTP和FTP這樣的TCP/IP協議。Java應用程式可通過一個特定的URL來打開並訪問對象,就像訪問本地檔系統那樣簡單。

Java語言提供的安全機制編譯器提供的安全機制位元組碼校驗器類加載器Java的基本特點3-2健壯性安全體系結構中立可移植性

Java在編譯和運行程式時都要對可能出現的問題進行檢查它提供自動垃圾收集來進行記憶體管理具有面向對象的異常處理機制

Java程式被編譯成一種與體系結構無關的位元組代碼只要安裝了Java運行時系統,Java程式可以在任意的處理器上運行源代碼級目標代碼級Java的基本特點3-3解釋執行高性能多線程動態Java語言內置支持多線程的功能Java類庫提供了Thread類Java自身的設計使它適合於一個不斷發展的環境。在Java類庫中可以自由地加入新的方法和實例變數而不會影響用戶程式的執行。通過JIT編譯器(Just-In-Time,運行時編譯執行的技術)首先將位元組碼編譯成固有代碼,將結果緩存下來,然後在需要時調用它們。編譯器javac.exe將處理.java原始檔案生成類檔類檔可通過名稱為java.exe的加載實用程式解釋執行,將Java位元組碼轉換為機器可執行代碼。瞭解Java的跨平臺性--機器語言不同種類的電腦有不同的機器語言瞭解Java的跨平臺性--高級語言

高級語言程式

目標語言程式編譯器的編譯

目標語言程式可能是:機器語言程式(如:C,C++)中間語言程式(如:Java的class代碼)瞭解Java的跨平臺性--操作系統OperatingSystem操作系統用來支持最基本的操作,比如創建檔和文件夾,在螢幕上顯示,列印等等。操作系統是用戶與電腦之間的主要介面。所有的程式都與操作系統通訊為一種平臺編寫的代碼不能在另一種平臺上運行。機器語言決定代碼移植的可行性SoftwareforIBMMachineSunSolarisSoftwareforSolarisMACSoftwareforMACMachineIBM平臺可以理解為電腦系統與硬體的結合體。編譯後執行的高級語言程式存在的問題問題Program為特定的平臺編寫的程式在其他平臺上無法使用解決辦法解釋器解釋器解釋器Program為解決這個問題,我們使用了“解釋器”。

這樣在解釋器的幫助下,我們就可以編寫一次代碼而在不同的平臺上運行。Java虛擬機Java程式的運行環境編譯型根源程式位元組碼程式Java根源程式可執行程式EXE裸機操作系統解釋器編譯連接編譯執行解釋執行.java.classJava是解釋執行的高級編程語言因此,每個平臺都有一個特定的JVM。即JVM是與平臺相關的平臺Java虛擬機2-1Java虛擬機(JVM—JavaVirtualMachine)可以是硬體或軟體(通常為軟體)。可以在操作系統和硬體平臺上模擬一種抽象化的電腦系統運行時環境,在上面執行Java的位元組碼程式。Java虛擬機將在內部創建一個運行時系統(JRE),主要功能如下:加載.class檔管理記憶體執行垃圾收集Java虛擬機2–2(即時編譯器)使用“即時(JustInTime)”編譯器,也稱為JIT編譯器。可以提高Java代碼的執行速度。SUN公司在Java2發行版中提供了JIT編譯器,JIT編譯器是Java虛擬機的一部分。JIT的主要用途是將位元組碼指令集轉換為針對某一特定微處理器的機器代碼指令。Java虛擬機2–3(Hotspot編譯器)Hotspot性能優化編譯器是對Java2平臺的增強,主要加速模組的組成部分:記憶體模型,垃圾收集,線程同步,本地編譯器。特性綜述:總體性能更強(和 JIT編譯器相比);針對平臺的最優化;精確的一次性垃圾收集器;Java虛擬機2–3(Hotspot編譯器)JavaHotspot性能優化編譯器主要包括兩個檔和其他一些調試庫檔,位置在jre\bin\目錄下:新版本JDK包含兩種編譯器(server和client),它們都有下麵兩個檔jvm.dllXusage.txt測試Hotspot:DOS提示符:>java-version提示資訊:使用“混合模式”,可以把使用頻率高的代碼編譯成本地代碼,而其他的代碼仍然解釋執行,可以獲得最高的效率。JavaHotSpot(TM)ClientVM(build1.4.1_02-b06,mixedmode)Java運行時環境編譯時.java(源代碼).class(位元組碼)運行時類加載器位元組碼校驗器解釋器JIT代碼生成器硬體網路垃圾收集2-1Java虛擬機使用兩個獨立的堆記憶體,分別用於靜態記憶體分配和動態記憶體分配。其中一個是非垃圾收集堆記憶體,用於存儲所有類定義、常量池和方法表。用於垃圾收集的演算法適用於存放在動態堆記憶體中的對象。垃圾收集2-2垃圾收集器將在收集對象實例之前調用finalize方法。即使顯式調用(System.gc())方法來啟動垃圾收集線程,但它也不能保證立即運行。因為垃圾收集線程的運行優先順序很低,所以可能經常會被中斷。Java的編輯環境JDK(JavaDevelopmentKit)是有助於程式員開發Java程式的Java開發工具包,它包括:類庫編譯器調試器Java運行時環境(JRE)小常識:Java2的版本號是和JDK的版本號相聯系的,在JDK1.2版本之後,都為Java2。JDK提供的常用工具

javac.exe是用來編譯源代碼的命令。

java.exe是用於執行類檔的命令,而類檔將在Java虛擬機中運行類。appletviewer命令允許在萬維網流覽器的環境之外運行Applet。JavaApplication程式基本結構import語句class{publicstaticvoidmain(String[]args){}}主類名稱方法體第一個Java程式//這是名稱為“HelloWorld.java”的簡單程式importjava.io.*;classHelloWorld{ publicstaticvoidmain(Stringargs[]){ System.out.println(“歡迎訪問Java世界!“);}}單行注釋導入必要的包定義類Main函數在控制臺上輸出在記事本編輯Java程式單擊開始依次選擇程式->附件->記事本//這是名稱為“HelloWorld.java”的簡單程式importjava.io.*;classHelloWorld{ publicstaticvoidmain(Stringargs[]){ System.out.println(“歡迎訪問Java世界!“);}}編譯和運行單擊開始依次選擇程式->附件->命令提示符進入程式所保存的目錄輸入命令編譯HelloWorld輸入命令執行HelloWorld輸出結果JavaAPI文檔2-1加載API文檔的步驟:打開InternetExplorer。鍵入下列URL/j2se/1.4.1/docs/api/index.html通過單擊相關主題,可以流覽網頁。JavaAPI文檔是一種非常有用的文檔,描述許多java的內置功能,包含類、包、介面等的幫助。

JavaAPI文檔2-2選擇包選擇包中的介面或類可查看相應幫助總結3-1Java是一種面向對象的編程語言,主要用於Internet應用程式。Java可用來生成兩類程式:應用程式、小應用程式(Applet)。Java既是一種解釋執行的語言,也是一種編譯執行的語言。總結3-2Java的特點包括:簡單面向對象分佈式健壯性安全體系結構中立可移植性解釋執行高性能多線程動態注釋Java語言提供三種類型的注釋:單行注釋多行注釋文檔注釋以//開始,並以換行符結束以/*开始,并以*/结束以/**开始,并以*/结束,注釋中的每一行都必須以*開始。使用javadoc工具從源代碼和文檔注釋中將資訊取出,然後轉換為HTML檔。變數命名規定2-1變數是在程式執行期間可根據需要經常變化的值,是指定給變數、方法和類的名稱,以便編譯器可唯一標識它們。變數具有3個特性:名稱:

識別字初始值:為其賦值或者是保留缺省值作用域:

在不同程式塊中的可用性及生命週期聲明示例:[<訪問修飾符>][<存儲修飾符>]<數據類型><變數名>;變數命名規定2-1對變數名的長度沒有任何限制。

變數名可包含字母數字字元。實際上,Java支持Unicode字元集,從而允許使用日語、中文字等符作變數命名。

變數名不能以非數字字元開頭。

其餘字元可以是字母,數字,下劃線(“_”),美元符(“$”)組成。變數名不得是關鍵字。關鍵字2-1原始數據類型byteshortintlongfloatdoublecharboolean迴圈關鍵字dowhileforbreakcontinue分支關鍵字ifelseswitchcasedefaultbreak方法、變數和類修飾符privatepublicprotectedfinalstaticabstractsynchronizedvolatilestrictfp(strictfloatprecision)關鍵字2-2異常處理trycatchfinallythrowthrows對象相關關鍵字newextendsimplementsclassinstanceofthissuper

字面值常量

false

true

null方法相關關鍵字

return

void

包相關關鍵字

package

import基本數據類型Java共有八種基本數據類型:四種整數類型(byte、short、int、long)兩種浮點數類型(float、double)一種字元類型(char)一種布爾類型(boolean)整型數據類型類型缺省值長度數的範圍byte08位-128~127

short016位-32,768~32,767

int032位-2,147,483,648~2,147,483,647

long064位-9,223,372,036,854,775,808~9,223,372,036,854,775,807

做為實例變數時的缺省值浮點型數據類型類型缺省值長度數的範圍float0.032位3.4E-038~3.4E+038

double0.064位1.7E-308~1.7E+308

字元數據類型類型缺省值長度數的範圍char'\u0000'

16位\u0000~\uFFFF

布爾數據類型類型缺省值長度數的範圍booleanfalse

1位false、true字串創建一個String類的實例:

Stringstr1=“comein”;//字串字面量Stringstr2=newString(“please!”);兩個或多個字串可以用“+”運算符合併起來。例如:str3=str1+“,haveaseat,”+str2;字串的長度可以通過String類中的函數計算。例如:intnumLength=str2.length();也可將數字添加到字串類型中。例如:StringstrVar=“thevalueis:”+1;字串池Java程式可包含許多字串字面量“字串池”存放在程式中創建的所有字串字面量任何時候創建字串字面量,系統都會搜索字串池,查看是否存在該字串字面量。SundayMondayHelloAptechWorld1234NStringday="Monday";Stringweekday="Monday";字串池String類方法charAt():返回字串中某個特定位置的字元

indexOf():返回字串中某個特定字元或子字串首次出現的索引

toUpperCase():將字串內的所有字元從小寫改為大寫toLowerCase():將字串內的所有字元從大寫改為小寫算術運算符運算符含義示例求值+加c=a+b

-減c=a-b

*乘c=a*b

/除c=a/b

%取模c=a%b

++遞增a++--遞減b--+=相加並賦值c+=a

c=c+a

-=相乘並賦值c*=a

c=c*a

/=相除並賦值c/=a

c=c/a

%=取模並賦值c%=a

c=c%a

-取負數c=-a關係運算符關係運算符用於測試兩個運算元之間的關係。關係運算式將返回一個布爾結果。運算符含義示例==等於a==b!=不等於a!=b>大於a>b<小於a<b>=大於或等於a>=b<=小於或等於a<=b邏輯運算符邏輯運算符兩側可以使用關係運算符和布爾運算元運算符含義示例!邏輯反!A||邏輯(短路)或A||B&&邏輯(短路)與A&&BpublicclassA{ publicstaticvoidmain(Stringargs[]) { booleanb1=true; booleanb2=false; System.out.println("theresult1is:"+(b1&&b2)); System.out.println("theresult2is:"+((3>2)||(4>5))); } }位運算符用於int、short、long、byte和char數據類型運算符含義示例~

按位非(NOT)

b=~a

&

按位與(AND)

c=a&b

|

按位或(OR)

c=a|b

^

按位異或(XOR)

c=a^b

>>

右移

b=a>>2

>>>

無符號右移,左邊空出的位以0填充

b=a>>>2

<<

左移

b=a<<1

注意:Java中沒有“無符號左位移”運算符

chara1=16; chara2=32; System.out.println("theresultis:"+(a1|a2));賦值運算符一次可以為多個變數賦值,如:inta=20000;intp,q,r,s;p=q=r=s=a;賦值運算符(=)用於為變數賦值三元運算符(?:)三元運算符(?:)可以替代if-else結構true

false條件?運算式1:運算式2

classPaySalary{publicstaticvoidmain(Stringargs[]){intsalary,daysPresent=30;

salary=daysPresent==20?2000:3000; System.out.println("您本月薪資為$"+salary);}}instanceof運算符classInstanceOfDemo{publicstaticvoidmain(Stringargs[]){ InstanceOfDemot=newInstanceOfDemo(); if(tinstanceofInstanceOfDemo){System.out.println("T是InstanceOfDemo的實例"); }

else{ System.out.println("T不是InstanceOfDemo的實例!"); }}}

可以確定對象是否屬於一個特定的類java.lang包2-1該包中包含的類是

Java編程語言設計的基礎其中比較重要的類包括:ObjectClass封裝類類體系結構的根封裝對象或介面運行時的狀態封裝基本數據類型,為基本數據類型建立對象運算式java.lang包2-2Math類String和StringBufferClassLoaderProcessRuntimeSecurityManagerSystem提供一些常用的數學運算的方法提供常用的字串運算提供“系統操作”,可以管理類的動態加載、外部進程的創建、主機環境查詢(如一天中的時間)及安全策略的執行等java.lang.Math2-1java.lang.Math類中可用的static方法有:abs():返回參數的絕對值ceil():返回大於或等於參數的最小整數floor():返回小於或等於參數的最大整數round():返回雙精度浮點數參數四捨五入後的整數或長整數java.lang.Math2-2max():返回兩個參數值中的大者min():返回兩個參數值中的小者random():返回類型為double且介於0.0和1.0之間的亂數控制結構選擇if-elseswitch迴圈whiledo-whileforJava支持下列控制結構:選擇、迴圈、跳轉跳轉breakcontinue

if-else選擇語句if-else

結構的語法為:if(條件)語句1;else

語句2;if(條件){語句組;}

else{

語句組;}if和else塊中只有一條語句if和else塊中有多條語句switch選擇語句switch結構的語法為:

switch(運算式){case'常量值1':語句(組);break;case'常量值2':語句(組);break;case'常量值N':語句(組);break;default:語句(組);}運算式必須為byte,short,int或char類型常量值必須是與運算式類型相容的特定的一個常量不允許有重複的case值迴圈while迴圈

while(條件) {語句組;}do-while迴圈do{語句組;}while(條件);for迴圈for(變數初始化;條件;遞增或遞減變數的值){語句組;}break和continue語句break語句在迴圈中用於立即從當前迴圈終止控制。遇到break語句時,將跳出當前迴圈。continue語句則是從其調用處跳至迴圈的開始處,再進行下一次迴圈。continue語句之後的語句將不再執行。return語句用於返回調用者。數組屬於複雜數據類型由類型相同的元素組成的有順序的數據集合數組是固定的不能擴展可以存儲基本數據類型或對象通過數組名和下標可以訪問各元素創建數組通用的一維數組的聲明格式是:

typearrayName[];或type[]arrayName;舉例: String[]arrayName; int[][]arrayName;//二維數組 或intarrayName[][];利用new來為數組型變數分配記憶體空間arrayName=newString[10];兩步可以合併,如:String[]arrayName=newString[10]; int[][]arrayName=newint[2][3];

數組聲明與賦值的其他格式數組可以聲明,分配記憶體空間和賦值一步完成:Stringstr[]=newString[]{“Tom”,”Marry”};int[][]a=newint[][]{{1,2,3},{4,5,6}};錯誤形式:inta[]=newint[3]{1,2,3};int[][]a=newint[2][3]{{1,2,3},{4,5,6}};數組賦值時,不能填寫size值命令行參數Java應用程式可以從命令行中接收任意數量的參數每個參數被視為字串分別存儲在main函數的參數數組中可以使用雙引號將多個字串作為一個整體顯示命令行參數示例classComndLineArg1{publicstaticvoidmain(Stringargs[]){for(inti=0;i<args.length;i++)

{System.out.println(args[i]);}}}

輸出結果輸出結果總結2-1Java具有8種基本數據類型:byte、short、int、long、boolean、char、float及doubleJava中的運算符可劃分為四個子集:算術運算符、位運算符、關係運算符、邏輯運算符&運算符適用於如下子集:邏輯和位。邏輯&以條件運算式為運算元,而位&則以數字為運算元類和對象2-1對象表示現實世界中某個具體的事物。抽象是從特定的實例中抽取共同的性質以形成一般化概念的過程。對象具有兩方面的含義:在現實世界中:是客觀世界中的一個實體在電腦世界中:是一個可標識的存儲區域類和對象2-2類是具有共同屬性和行為的對象的抽象。類可以定義為數據和方法的集合。類也稱為範本,因為它們提供了對象的基本框架。類對象抽象實例化屬性或狀態操作或行為數據或變數方法封裝的實體=數據+方法創建類classname{typevariable1;

…typevariableN;

typemethodname1(parameter-list){//方法體}

…typemethodnameN(parameter-list){//方法體}}

在類中,屬性是通過成員變數體現的,而操作是用成員函數(又稱為方法)實現的。Java中定義類的通用格式:成員變數(對象屬性)成員方法(對象行為或操作)定義方法定義方法的一般格式:[accessmodifier]typemethodName([parameter-list]){//方法體}發往某個對象的消息對應於一個方法調用。作為對消息的回應,對象將執行一個類似於過程體的方法。方法是包含在類中的函數。方法名稱返回類型修飾符,可選參數列表,可選舉例:publicvoidsetdate(intday,intmonth,intyear){day=23;month=7;year=2003;}對象作為參數classTest{inta,b;

Test(inti,intj){a=i;b=j;}//可以在方法中改變對象狀態

voidchange(Testobj){

obj.a=50;

obj.b=40;}}

當對象作為方法參數時,在方法中只能改變該對象的狀態,但不能通過該對象的引用的改變其狀態voidswapobj(Dayx,Dayy){

Daytemp=y;

y=x;

x=temp;}

引用本身按值傳遞改變對象狀態this引用publicclassTest{

intx; Test(intx){

this.x=x;}publicvoidshowValue(){System.out.println(“x等於"+x);

}publicstaticvoidmain(Stringargs[]){ Testtest=newTest(10); test.showValue(); }}

關鍵字this與對象關聯它用於指示當前對象指明此對象的屬性變數x應賦值為通過構造方法傳遞的參數引數x的值。

方法重載(overload)方法重載是Java實現面向對象的多態性機制的一種方式。同一個類中多個方法有相同的名字,不同的參數列表,這種情況稱為方法重載。返回類型不同並不足以構成方法重載。當重載方法被調用時,編譯器根據參數的類型和數量來確定實際調用哪個重載方法的版本。注意方法重載(overload)與方法重寫(override)的區別,後面將介紹方法重寫的概念。方法重載示例classCalculation{

publicvoidadd(inta,intb){intc=a+b;System.out.println("兩個整數相加得"+c);}

publicvoidadd(floata,floatb){floatc=a+b;System.out.println("兩個浮點數相加得"+c);}

publicvoidadd(Stringa,Stringb){Stringc=a+b;System.out.println("兩個字串相加得"+c);}}

classCalculationDemo{publicstaticvoidmain(Stringargs[]){ Calculationc=newCalculation(); c.add(10,20); c.add(40.0F,35.65F);

c.add("早上","好");

}}

編譯器決定調用版本構造函數構造函數名稱與類名稱相同構造函數沒有返回類型其任務是在創建對象時初始化其內部狀態classFruit{booleanseedLess;booleanseasonal;floatprice;Fruit(booleanseed,booleanseason,floatp){

seedLess=seed; seasonal=season; price=p; }

}創建對象使用下列語法可創建對象:

new構造方法關鍵字new通常稱為創建運算符,用於分配對象記憶體,並將該記憶體初始化為缺省值。一旦new完成分配和初始化記憶體,它就將調用構造函數來執行對象初始化。

當創建一個類時,只是創建了一種新的數據類型。對象是類的一個實例。classFruitDemo{publicstaticvoidmain(Stringargs[]){ Fruitf=newFruit(true,false,50.0F);}}

創建對象缺省初始值Java保證了在任何代碼使用該記憶體之前,已至少將記憶體初始化為可預知的缺省值類型缺省值類型缺省值byte(byte)0char'\u0000'short(short)0float0.0Fint0double0.0Dlong0L對象引用nullbooleanfalse重載構造函數Java為每一個類自動提供缺省構造函數缺省構造函數將成員變數的值初始化為缺省值一旦創建了自己的構造函數,缺省的構造函數將不復存在。重載構造函數提供了一組創建對象的方式,可以根據需要決定是否帶初始參數。publicclassconstructOverload{intx;constructOverload(){x=0;

System.out.println("不帶參數的構造函數");}

constructOverload(intx){this.x=x;System.out.println("帶一個參數的構造函數");}}談談“繼承”被繼承的類稱為父類繼承父類的類稱為子類執行繼承時,子類將獲得父類的屬性,並具有自身特有的屬性。

繼承是面向對象編程技術的一塊基石,它允許創建分等級層次的類。運用繼承,可以創建一個通用類定義一系列一般特性。該類可以被更具體的類繼承Emoloyee類:namesexWorker類:categorydressAllowanceOfficer類:empClassvehicle職員類,具有姓名和性別兩個屬性工人類,繼承了父類的姓名和性別屬性外還包含類別和是否有服裝津貼屬性主任類,還包含級別和是否配備交通工具屬性extends關鍵字extends關鍵字用於繼承類。聲明一個繼承父類的類的通常形式如下:classsubclass-nameextends

superclass-name{//類體}

沒有extends,默認父類為ObjectJava類只能有一個父類,即單繼承子類自動繼承父類的全部成員注意super關鍵字super關鍵字用來解決如何直接訪問或初始化從父類繼承來的屬性。super有兩種通用形式:調用父類的構造函數、用來訪問被子類的成員覆蓋的父類成員。

它用在對象的構造函數中,將構造細節通過繼承鏈往上傳遞。super()必須是在子類構造函數中的第一個執行語句。繼承示例classEmployee{

Stringname;//姓名

charsex;//性別

Employee(Stringn,chars){name=n;sex=s;}publicStringgetName(){returnname;}publicchargetSex(){returnsex;}}classWorkerextendsEmployee

{

charcategory;//類別

booleandressAllowance;//是否提供服裝津貼Worker(Stringn,chars,charc,booleand){

super(n,s);

category=c;dressAllowance=d;}publicchargetCategory(){returncategory;}

publicbooleangetAll(){returndressAllowance;}}classInheDemo{publicstaticvoidmain(Stringargs[]){Workerw=newWorker("M.John",'M','B',true);

System.out.println("工人資訊");

System.out.println("姓名

:"+w.getName());System.out.println("性別

"+w.getSex());

System.out.println("類別

:"+w.getCategory());if(w.getAll())System.out.println("提供服裝津貼");

elseSystem.out.println(“未提供服裝津貼”);

}}instanceofclassStudent{}classGraduateextendsStudent{}classUndergraduateStudentextendsStudent{}publicclassst{publicstaticvoidmain(String[]args){UndergraduateStudents1=newUndergraduateStudent();Graduates2=newGraduate();Studentx;

x=s1;if(xinstanceofUndergraduateStudent)System.out.println(“x是UndergraduateStudent類的實例。”);elseSystem.out.println(“x是Graduate類的實例。”);}}instanceof測試第一個參數的運行時類型是否為與第二個參數相容的賦值。x在運行時指向s1,所以if語句條件返回true注意:s1=s2;是錯誤的!類型轉換執行自動類型轉換需要兩個條件:接受轉換的兩種類型是相容的目的類型數的範圍比源類型的大強制類型轉換語句的通用格式如下:

(目標類型)valueUndergraduateStudents1=newUndergraduateStudent();Graduates2=newGraduate();Studentx;x=s1;Graduates3=newGraduate();if(xinstanceofGraduate)

s3=(Graduate)x;

注意:從父類到子類的轉換,建議在轉換前判斷父類引用是否指向子類的對象Object類Object類是類體系結構的根Java系統中的每個類都是Object類直接或間接的子類Object類包括在java.lang包中此類定義了所有對象都具備的基本狀態和行為可以用類型為Object的變數來引用任意類型的對象equals()用於比較兩個對象是否相等,相等返回trueObject類中提供的equals方法使用恒等函數來確定對象是否相等Object類中實現的equals方法只能用來判斷兩個不同的對象是否指向同一個記憶體區域子類一般通過覆蓋Object的equals方法實現有意義的測試,可以實現:若同一類型的兩個不同對象包含相同的資訊即返回trueIntegerone=newInteger(1);IntegeranotherOne=newInteger(1);if(one.equals(anotherOne))System.out.println("對象相等");equals()方法與等號“==”的區別:“==”用於數值之間的絕對比較,如果用來比較兩個對象,即使這兩個對象屬於同種類型,也因為記憶體地址的不同,而為false例如: Stringname1=newString(“tom”);Stringname2=newString(“tom”);if(name1==name2){}//結果為falseequals()方法用於同類型兩個對象之間,數據成員的比較。if(2){}//結果為truetoString()toString用於返回對象的字串表示。

建議所有子類都覆蓋此方法。使用“+”運算符將對象同一個字串連接,Java編譯器會自動調用toString方法,獲取對象的字串表現形式。Derivedd=newDerived();System.out.println("Derived的

toString():"+d);自動調用d.toString方法,獲取對象的字串表示形式方法重寫(override)方法重寫是Java實現多態性機制的另一種方式。在類層次結構中,如果子類中的一個方法與父類中的方法有相同的方法名並具有相同數量和類型的參數列表,這種情況稱為方法重寫。當一個重寫方法通過父類引用被調用,Java根據當前被引用對象的類型來決定執行哪個版本的方法。可以通過super關鍵字調用直屬父類中被覆蓋的方法版本。方法重寫示例classSuperClass{inta;SuperClass(){a=10;}

publicvoidprintA(){System.out.println("父類中a="+a);}}classSubClassextendsSuperClass{inta;SubClass(inta){this.a=a;}

publicvoidprintA(){System.out.println("子類中a="+a);}}

publicclassOverrideDemo{publicstaticvoidmain(Stringargs[]){SuperClasss1=newSubClass(10);

s1.printA();}}將調用子類的printA方法包在Java中,包主要有以下用途:包允許將類組合成較小的單元有助於避免命名衝突包允許在更廣的範圍內保護類、數據和方法

包可以是類、介面和子包的集合代碼的複用性是軟體開發中最關注的特點。複用性將為您節省時間、精力並能保證一致性。介面包類其他的包使用包創建包

packagemypackage;導入包importpackage_name.*;(包中的通用類和介面,不含子包)Importpackage_name.My_Class;導入子包importpackage_name.subpackage_name.*;訪問Java包成員

mypackage.My_Class;編譯包命令:>javac–d目錄名原始檔案名Java中重要的包包含了建立Java程式的基本類。您不需要顯式地寫出導入這個包的語句,任何程式中,該包都被自動導入。這個包由對您的輸入/輸出操作有用的類組成。該包由您在流覽器中執行一個applet所需要的類組成。該包對創建GUI應用程式有用。

該包提供了許多創建如:lists,calendar,date等所需要的類和介面。該包提供了許多進行TCP/IP網路編程的類和介面。java.langjava.iojava.appletjava.awtjava.util修飾符修飾符是為代碼和類指定附加意義的關鍵字。有兩種類型或類別的修飾符:訪問修飾符非訪問修飾符訪問修飾符的類型有:publicprotectedprivate類繼承的訪問修飾符(public,friendly)類成員的訪問說明符(public,protected,friendly,private)訪問修飾符的訪問屬性描述privatefriendlyprotectedpublic同一類是是是是同一包不同類否是是是同一包子類否是是是不同包不同類否否否是不同包子類否否是是訪問修飾符public訪問修飾符:使類的特徵公用於任何類。protected訪問修飾符:(只有屬性和方法可以聲明為protected)允許來自下麵的訪問

類本身

同一包中的子類和其他類

出現在不同包中子類private訪問修飾符:限制最大的訪問修飾符,一旦用來修飾類,那麼該類只能從類內部來訪問。訪問修飾符(續)friendly修飾符:如果類、變數或方法沒有修飾符,則它們將獲得此修飾符的訪問許可權。它們能被同一包中的任何類訪問。這指的是說即使一個類是該類的子類,但如果在不同的包中,也不能訪問。非訪問修飾符static修飾符:能用於變數,方法和一塊代碼。

類中的Static變數或方法不是指特定的實例。它能夠與“類名”一起使用,不需要創建一個類的對象來訪問該類的靜態特徵。abstract修飾符可用於類和方法:

類—此類不能實例化。

方法—必須在此abstract類的子類中提供該方法的實現。

一個類在下面情況下成為

abstract:

當一個類的一個或多個方法是抽象的時候;

當類是一個類的子類,並且不能為任何抽象方法提供實現;當一個類實現一個介面,並且不能為任何抽象方法提供實現;非訪問修飾符(續1)final修飾符被用在變數,方法和類。其作用如下:變數

:指定後,一旦賦了值,就不能更改它。方法

:指定後,不能更改方法主體。類

:指定後,此類不能再產生子類。某個類的對象

:指定後,不能更改在對象中的引用,但是可 以更改該對象的值。非訪問修飾符(續2)native修飾符“native”只能與方法一起使用。此關鍵字指出方法的主體將在別處提供,例如在“Java虛擬機”外。因此本機代碼將用Java以外的語言編寫,並且其編譯用於本機。synchronized用於控制多線程的程式。volatile與變數一起使用,指示變數的值可以更改。總結2-1對象代表現實世界中的實體

類是對象的抽象,將對象的屬性和行為抽象為類中的數據和方法。在Java中,extends關鍵字用於繼承類。super關鍵字用來解決如何直接訪問或初始化從父類繼承來的屬性。構造方法沒有返回類型,名稱與類的名稱相同。關鍵字this與對象關聯用於指明當前對象。類的靜態成員類中的靜態變數、方法或代碼塊屬於類,而不屬於某個特定的對象。

類的靜態成員可以與類的名稱一起使用,而無需創建類的對象。

靜態變數或方法也稱為類變數或類方法。用static修飾符修飾,可以是變數、方法或代碼塊思考:引入靜態成員的意義?靜態變數不管創建了類的多少實例,整個類中靜態變數的副本只有一個。

引用靜態變數的方法:通過引用類的任一實例通過類的名稱classStaticDemo{

staticintx=0;

StaticDemo(){x++;}}StaticDemod1=newStaticDemo();StaticDemod2=newStaticDemo();d1.x=100;d2.x=200;testVariable=d1.x;

通過類實例訪問不是一個好方法StaticDemod1=newStaticDemo();StaticDemod2=newStaticDemo();

StaticDemo.x=100;StaticDemo.x=200;testVariable=StaticDemo.x;

聲明為static的變數實質上就是全局變數通過類名訪問靜態方法與靜態方法相關的幾個要點:類的靜態方法只能訪問其他的靜態成員靜態方法沒有this靜態方法不能被重寫為非靜態方法classStaticFun{staticinti=10;intj;staticvoidsetValue(intx){

j=x;//出錯System.out.println(""+i);}}不能訪問非靜態變數j,可以訪問靜態變數iclassStaticTest{staticvoidtest(){}}classStaticex

extends

StaticTest{

voidtest(){}//出錯}

靜態塊如果需要通過計算來初始化靜態變數,可以聲明一個靜態塊。靜態塊僅在該類被加載時執行一次。只能初始化類的靜態數據成員。

classTryInitialization{

staticint[]values=newint[10];//靜態數組成員

static{for(inti=0;i<values.length;i++)values[i]=(int)(100.0*Math.random());

}}

final關鍵字/final類final修飾符可應用於類、方法和變數。final在應用於類、方法和變數時意義是不同的,但本質是一樣的:final表示不可改變。

聲明為final的類不能被繼承。final類示例:

java.lang.String

final

classTestFinal{inti=7;intj=1;voidf(){}}classFurtherextendsTestFinal{}

final類不能被繼承final方法在方法聲明中使用final關鍵字向編譯器表明子類不能覆蓋此方法。在聲明類中,一個final方法只被實現一次。如果一個類為

final類,那麼它的所有方法都為隱式的

final方法。classTestFinal{finalvoidf(){}}classFurtherextendsTestFinal{finalvoidf(){}}

final方法不能被覆蓋final變數一個變數可以聲明為final,這樣做的目的是阻止它的內容被修改。聲明final變數後,只能被初始化一次,然後就不能對其值進行修改。一個final變數實質上是一個常量。

classFinalDemo{ publicstaticvoidmain(Stringargs[]){finalintnoChange=20;

noChange=30;

}}

final變數不能被修改抽象類2-1定義抽象類的目的是提供可由其子類共用的一般形式。子類可以根據自身需要擴展抽象類。抽象類不能實例化。抽象方法沒有函數體。抽象方法必須在子類中給出具體實現。abstract修飾符可與類和方法一起使用抽象類2-2在以下情況下,某個類將成為抽象類:當一個類的一個或多個方法為抽象方法時。當該類為一個抽象類的子類,並且沒有為所有抽象方法提供實現細節或方法主體時。當一個類實現一個介面,並且沒有為所有抽象方法提供實現細節或方法主體時。抽象類示例abstractclassEmployee{ intbasic=2000;

abstractvoidsalary();//抽象方法}classManagerextendsEmployee{voidsalary(){ System.out.println("薪資等於"+basic*5);}}

classWorkerextendsEmployee{voidsalary(){ System.out.println("薪資等於"+basic*2);}}

抽象方法沒有方法主體在子類中提供實現在子類中提供實現介面一個介面允許一個類從幾個介面繼承而來。Java程式一次只能繼承一個類但可以實現幾個介面。介面不能有任何具體的方法。介面也可用來定義可由類使用的一組常量。介面提供“isa”關係。

創建介面的形式//有方法的介面publicinterfacemyinterface{ publicvoidadd(intx,inty); publicvoidvolume(intx,inty,intz);}//定義程式使用的常量的介面publicinterfacemyconstants{ publicstaticfinaldoubleprice=1450.00;publicstaticfinalintcounter=5;}定義一個介面:實現,編譯介面實現介面的形式:用關鍵字implements實現介面,例如:classdemoimplementsmyinterface如果有一個以上介面被實現,則用逗號隔開介面名稱,如下所示:

classdemoimplementsMycalc,Mycount編譯形式如下:javac介面原始檔案名.javajavac–d目的目錄名介面原始檔案名.java創建一個介面publicinterfacemyinterface{publicvoidadd(intx,inty);}在Java中,介面的實現按下麵的方式進行:當右邊的代碼執行時,將在“JavaProgs”檔夾下創建檔夾“mypackage”,並且在該檔夾下產生“myinterface.class”檔代碼的編譯方法如下:javac–dc:\JavaProgs\mypackagemyinterface.java在程式中實現介面importjava.io.*;importmypackage.*;classdemoimplementsmyinterface{ publicvoidadd(intx.,inty) { System.out.println(“”+(x+y); } publicstaticvoidmain(Stringargs[]) { denod=newdemo(); d.add(10,20); }}導入

myinterface.class

檔所在的包封裝類基本數據類型不是對象層次結構的組成部分。有時需要象處理對象一樣處理這些基本數據類型,可通過相應的“封裝類”來將其“封裝”。

數據類型封裝類(WrapperClass)booleanBooleanbyteBytecharCharacterdoubleDoublefloatFloatintIntlongLongshortShort封裝類使用示例BooleanwrapBool=newBoolean("false");Integernum1=newInteger("31");Integernum2=newInteger("3");intsum=Value()*Value();intValue()返回調用對象的整型值

classCmdArg{publicstaticvoidmain(Stringargs[]){ intsum=0; for(intcnt=0;cnt<args.length;cnt++)sum+=Integer.parseInt(args[cnt]); System.out.println("和為:"+sum);}}

parseInt()方法將執行從字串轉換成與之相應的整型(int)值

內部類內部類為非靜態的嵌套類。在類中定義的類稱為內部類。內部類之外的類稱為外部類。內部類可以訪問其外部類的所有變數和方法,並能夠以和外部類的其他非靜態成員相同的方式直接引用它們。內部類完全在其包圍類的範圍之內。外部類與內部類的關係是:“havea”內部類使用示例classOuterClass{ Stringstr; booleanouterClassAccessible;

InnerClassin;//在外部類中使用內部類,需聲明內部類的實例 publicOuterClass(){//代碼見實例} classInnerClass { Stringstr; booleaninnerClassAccessible; publicInnerClass(){//代碼見實例

}//可以把內部類當作是外部類的方法,因此不需聲明外部類的實例 }}總結2-1類中的靜態變數、方法或代碼塊並不具體到實例,它們可以與類的名稱一起使用,而無需創建類的對象來訪問類的靜態特性。final修飾符可應用於類、方法和變數。

定義抽象類的目的是提供可由其子類共用的一般形式。介面就是需要由其他類實現的行為範本。

什麼是異常運行時發生的錯誤稱為異常(Exception)。處理這些異常就稱為異常處理。一旦引發異常,程式將突然中止,且控制將返回操作系統。發生異常後此前分配的所有資源都將保留在相同的狀態,這將導致資源漏洞。何時使用Java中異常?1)如果是可以預料到的,通過簡單的運算式修改就可以處理好的,就不必使用異常(如數組越界錯誤)2)因為異常佔用了JAVA程式的許多處理時間,簡單的測試比處理異常的效率更高。所以,建議將異常用於你無法預料或無法控制的情況。(如打開遠程檔,而Error異常就不必處理)(Error的實例是JAVA運行時環境(JVM)中的內部錯誤,通常是致命的,對它們你無法做太多的工作)3)花費時間處理異常可能會影響你的代碼的執行速度,但在稍後的專案和在越來越大的程式中再次使用你的類時,這種額外的小心將會給你帶來極大的回報。(當然JAVA類庫是小心編寫的,它已經足夠強壯)異常體系結構2-1所有異常類型都是內置類Throwable的子類用於Java運行時系統來顯示與運行時系統本身有關的錯誤用於用戶程式可能捕獲的異常,也是用來創建用戶異常類型子類的類。Error類對象由Java虛擬機生成並拋出;Exception類對象由應用程式處理或拋出。異常體系結構2-2Java中的異常是實際的對象,是從類Throwable繼承而來的派生類的實例。Throwable類有兩個子類:Error和ExceptionJava的Exception類實現了Throwable介面並提供一些有用的特性來處理異常,特別是為消息提供了管道,包含一個棧跟蹤。類Exception的子類分為兩組:1)運行時異常(類RuntimeException的子類)通常是因為代碼不夠強壯而發生。各種運行時異常都繼承Exception類,負責記錄拋出的異常資訊。2)其他異常(例如:IOException)常見異常及其用途2-1異常說明RuntimeException

java.lang包中多數異常的基類

ArithmeticException

算術錯誤,如除以0

IllegalArgumentException

方法收到非法參數

ArrayIndexOutOfBoundsException

數組下標出界

NullPointerException

試圖訪問

null對象引用

SecurityException

試圖違反安全性

ClassNotFoundException不能加載請求的類常見的異常及其用途2-2異常說明AWTException

AWT中的異常

IOException

I/O異常的根類

FileNotFoundException

不能找到檔

EOFException

檔結束

IllegalAccessException

對類的訪問被拒絕

NoSuchMethodException

請求的方法不存在

InterruptedException

線程中斷

Java異常處理基礎Java異常處理機制採用一個統一和相對簡單的拋出(throw)和處理錯誤的機制。如果一個方法本身能引發異常,當所調用的方法出現異常時,調用者可以捕獲(catch)異常使之得到處理;也可以回避異常,這時異常將在調用的堆疊中向下傳遞,直到被處理。異常處理模型由五個關鍵字try、catch、throw、throws

finally

處理。Java中可用於處理異常的兩種方式:自行處理:可能引發異常的語句封入在try塊內,而處理異常的相應語句則封入在catch塊內。回避異常:在方法聲明中包含throws

子句,通知潛在調用者,如果發生了異常,必須由調用者處理。

如本級調用者不能處理,就再上傳到上級處理,即使用調用鏈系統。try-catch塊示例

publicclassExceptionDemo{

publicstaticvoidmain(Stringargs[]){

try{

intc=calculate(9,0);

System.out.println(c);

}

catch(Exceptione){

System.err.println("發生異常:"+e.toString()); e.printStackTrace();

} }

staticintcalculate(inta,intb){ intc=a/b;returnc; }}

調用方法calculate,將引發一個異常在catch塊中處理異常輸出結果多個catch塊單個代碼片段可能會引起多個錯誤。可提供多個catch塊分別處理各種異常類型。...try{}catch(ArrayIndexOutOfBoundsExceptione){}catch(Exceptione){}...ArrayIndexOutOfBoundsException類為Exception類的子類,但是如果異常屬於ArrayIndexOutOfBoundsException類將執行第一個catch塊,之後控制將轉向try/catch塊之後的語句,所以始終不會執行第二個catch塊。

多個catch塊示例classCatch22{

public

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论