第一篇:java程序設(shè)計(jì)教案
課程教案
(理論教學(xué))
課程名稱: Java程序設(shè)計(jì) 課程類型:(2)
1、必修;
2、選修;
3、其它 授課對(duì)象: 專業(yè)(本科)級(jí) 班 授課時(shí)間: 至 學(xué)年第 學(xué)期
計(jì)劃學(xué)時(shí): 學(xué)時(shí)(其中:理論,實(shí)驗(yàn):)
任課教師: 所屬學(xué)院: 課程管理部門(教研室):
大理學(xué)院教務(wù)處 制
課程名稱:Java程序設(shè)計(jì) 教
材:Java程序設(shè)計(jì)教程
講 授 人:
專業(yè)技術(shù)職務(wù):講師 學(xué)
歷: 研究生
學(xué)
位:碩士 講授題目:
所屬章節(jié):
計(jì)劃學(xué)時(shí): 教學(xué)目的和要求: 教學(xué)重點(diǎn): 教學(xué)難點(diǎn): 教學(xué)方法:
使用教具
大理學(xué)院課程教案(教學(xué)內(nèi)容)
第一章
Java語言簡(jiǎn)介
教學(xué)目的要求
了解Java的基本特點(diǎn)和用途 掌握如何下載Java SDK軟件包 了解設(shè)置Java程序的開發(fā)環(huán)境SDK 如何運(yùn)行Java程序 了解Java的概貌
主要內(nèi)容
? Java語言的發(fā)展歷程; ? Java語言的特點(diǎn);
? Java語言的開發(fā)工具;
? Java應(yīng)用程序和小程序; ? Java程序的注釋方法; ? 寫Java程序的風(fēng)格規(guī)范。重點(diǎn)內(nèi)容
? Java語言的特點(diǎn);
? Java語言的開發(fā)工具;
? Java應(yīng)用程序和小程序; 難點(diǎn)內(nèi)容
無 課時(shí)分配
1課時(shí) 教學(xué)方法
講授法、演示法、對(duì)比法 講授內(nèi)容提要
1.1
Java語言的發(fā)展簡(jiǎn)介
1991年Sun Mircosystem 公司成立了一個(gè)Green項(xiàng)目開發(fā)小組,Jame Gosling 為組長(zhǎng); 設(shè)計(jì)Java 采用虛擬機(jī)代碼(Virtual Machine Code),即.class文件,它通過解釋器運(yùn)行 ; 1995年5月Sun Mircosystem 公司對(duì)外正式發(fā)布Java1.0;
Java2 用途:適用于各種應(yīng)用開發(fā),尤其是網(wǎng)絡(luò)應(yīng)用,網(wǎng)絡(luò)服務(wù)和嵌入式系統(tǒng)。1.2
Java語言的特點(diǎn) 1.簡(jiǎn)單性 2.面向?qū)ο?3.網(wǎng)絡(luò)適用性 4.健壯性 5.安全性 6.平臺(tái)無關(guān)性 7.可移植性 8.解釋型 9.高性能
/ 87
? ? ? ? ? 大理學(xué)院課程教案(教學(xué)內(nèi)容)
10.多線程 11.動(dòng)態(tài)性
12.豐富的類庫 13.嵌入瀏覽器運(yùn)行 1.3
Java類庫的概念 1.4
網(wǎng)絡(luò)瀏覽器 1.5
Java開發(fā)工具
NetBeans: 這個(gè)集成環(huán)境可以方便地進(jìn)行程序的編輯、編譯、生成和運(yùn)行。J2sdk :
http:// java.sun.com免費(fèi)下載;Visual J++ 6.0 / 8.0: VJ++還吸收了VB集成開發(fā)環(huán)境IDE的特征,是一個(gè)強(qiáng)有力的Java程序開發(fā)工具。Jcreator
Eclipse(MyEclipse)等
1.6
Java程序的分類 基于控制臺(tái)的應(yīng)用程序;
基于瀏覽器運(yùn)行的小程序applet。
小程序與應(yīng)用程序的區(qū)別是:小程序必須依賴一個(gè)HTML文件和支持Java的網(wǎng)絡(luò)瀏覽器。老師演示小程序和applet程序
應(yīng)用程序舉例(程序1-1): public class hello {
public static void main(String args[ ]){
System.out.println(“Hello Java!”);
} }
小程序舉例(程序1-2):
import java.awt.Graphics;
// 注意該行的含義 import java.applet.Applet;public class sayhello extends Applet {
public void paint(Graphics g){
g.drawString(“Hello Java!”,35,30);
} }
小程序?qū)?yīng)的HTML文件:
/ 87
大理學(xué)院課程教案(教學(xué)內(nèi)容)
1.7
1.8 對(duì)Java程序的解釋
編寫Java程序的風(fēng)格要求
課堂練習(xí):
請(qǐng)編寫一個(gè)應(yīng)用程序輸出你自己的學(xué)號(hào)和姓名 課外練習(xí)(作業(yè)): 下載并安裝J2SDK; 設(shè)置系統(tǒng)環(huán)境變量 下載并安裝MyEclipse 熟悉MyEclipse的開發(fā)環(huán)境
第2章
數(shù)據(jù)類型、運(yùn)算符和表達(dá)式
教學(xué)目的要求
掌握字符常量和符號(hào)表示的常量的概念和應(yīng)用
掌握整形、浮點(diǎn)型、字符型和布爾型變量的概念和應(yīng)用 掌握數(shù)據(jù)的概念 理解參數(shù)傳遞方式
學(xué)會(huì)邏輯運(yùn)算符、算術(shù)運(yùn)算符和位運(yùn)算符的使用方法
主要內(nèi)容
? 常量:包括字面常量和符號(hào)表示的常量; ? 變量:整形、浮點(diǎn)型、字符型和布爾型; ? 數(shù)組:Java的數(shù)組屬于類類型; ? 參數(shù)傳遞方式;
? 運(yùn)算符:包括邏輯運(yùn)算符、算術(shù)運(yùn)算符和位運(yùn)算符等;
重點(diǎn)內(nèi)容
? 整形、浮點(diǎn)型、字符型和布爾型變量的概念和應(yīng)用; ? 符常量和符號(hào)表示的常量的概念和應(yīng)用 難點(diǎn)內(nèi)容
? 參數(shù)傳遞方式 課時(shí)分配
2課時(shí) 教學(xué)方法
講授法、演示法、對(duì)比法、實(shí)驗(yàn)驗(yàn)證法 講授內(nèi)容提要 2.1
常量
整形常量:采用八進(jìn)制、十進(jìn)制、十六進(jìn)制表示,但不能采用二進(jìn)制表示,和C/C++中的一樣。
浮點(diǎn)常量:采用十進(jìn)制或科學(xué)記數(shù)法表示。在缺省情況下一個(gè)浮點(diǎn)數(shù)是double型。布爾常量:true和false,它們不是數(shù),不能進(jìn)行算術(shù)運(yùn)算。字符常量:與C/C++中的表示類似
。字符串常量:Java中字符串常量是對(duì)象。2.2
變量
變量的命名原則是:以字母(’a’?’z’和 ’A’?’Z’)、下劃線(‘_’)和‘$’符號(hào)開頭的,由字母、數(shù)字(’0’?’9’)、下劃線和‘$’構(gòu)成的一個(gè)符號(hào)序列。
例如,a,_a,NameOfStudent,$10均是合法變量名,而-a和9a是非法變量名。關(guān)鍵字不能用作變
/ 87
? ? ? ? ? 大理學(xué)院課程教案(教學(xué)內(nèi)容)
量名(見表2-1)注意:Java對(duì)變量是區(qū)分大小寫.2.2.1
整形類型的變量 字節(jié)(byte)型,8個(gè)位。
短整形(short),占16個(gè)位。整形(int),占32個(gè)位。
長(zhǎng)整形(long int),占64個(gè)位。
Java中的整形最值均有符號(hào)。例如程序2-1測(cè)試最值:
public class Test_Int {
// 程序2-1 測(cè)試整形變量的最值
public static void main(String [ ] args){ System.out.println(Byte.MAX_VALUE);
System.out.println(Byte.MIN_VALUE);
System.out.println(Short.MAX_VALUE);System.out.println(Short.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
} }
注意: byte、short、int、long是原子類型,而Byte、Short、Integer和Long分別是四種原子類型對(duì)應(yīng)的類類型。
2.2.2
字符類型變量
Java字符量的長(zhǎng)度為16個(gè)位,表示范圍是從‘u0000’ 到 ‘uffff’ 即從0 到 65535; Character是char類型對(duì)應(yīng)的類類型 ; 最大值 Character.MAX_VALUE ; 最小值 Character.MIN_VALUE ; 2.2.3
浮點(diǎn)類型變量 分類:float和double。
Float、Double 是對(duì)應(yīng)的類類型 ;
Float.MAX_VALUE、Float.MIN_VALUE是最值。Float.POSITIVE_INFINITY 和
Float.NEGATIVE_INFINITY是正/負(fù)無限大。2.2.4
布爾類型變量
boolean變量取值:true和false ;
true和false不能轉(zhuǎn)換成任何數(shù)值表示,true不是1,false也不是0。2.2.5
原子類型變量的生存空間
一個(gè)變量的生存空間是由兩個(gè)大括號(hào)決定的 范圍。下列寫法在C/C++中是正確的,但在Java中是錯(cuò)誤的(注意)。{ int x=1;{
/ 87
大理學(xué)院課程教案(教學(xué)內(nèi)容)
int x=0;// 錯(cuò)誤
} }
2.3
變量賦值問題
如果類中定義的原子類型變量,未給出初值,那么它們將有缺省值 :byte、short、int 和long變量的缺省值是0;char、float、double和boolean變量的缺省值分別是’u0’、0.0f、0.0d和false。
方法內(nèi)定義的局部變量,應(yīng)當(dāng)對(duì)其賦值,否則無法通過編譯。例如: // 程序2-4 class Test {
// 定義一個(gè)類
int Value;// 類中的變量未賦值,缺省就是0 } public class Test_Var{ public static void main(String [ ] args){
int x=100;
// 必須賦值,否則無法通過編譯
Test obj=new Test();// 對(duì)象賦值
System.out.println(obj.Value +“
”+x);
} } 2.4
數(shù)組
Java數(shù)組是系統(tǒng)定義類Array 的子類; 數(shù)組的分類同C/C++:一維和多維。2.4.1
一維數(shù)組
定義數(shù)組的格式 :int a[ ] ; 或
int[ ] a ;其值是null ;
在定義數(shù)組時(shí)不能指定大小。a僅是一個(gè)引用,代表一個(gè)數(shù)組名,但沒有對(duì)應(yīng)的空間。產(chǎn)生數(shù)組空間的方法有兩種 :
在定義時(shí)直接賦值:int a[ ]={1,2,3};
通過new分配空間: int a[ ]=new int[10];public class Test_Array{
public static void main(String [ ] args){
int a[ ]={1,2,3}, b[ ];
b= a;
for(int i=0;i<3;i++)b[ i ]++;
for(int i=0;i<3;i++)System.out.println(a[i]);
} }
public class Test_Array{
public static void main(String [ ] args){
int a[ ]={1,2,3}, b[ ];
b = new int[6];
System.out.println(“b數(shù)組長(zhǎng)度 = ” + b.length);
for(int i=0;i System.out.print(b[i]+“ / 87 ”); 大理學(xué)院課程教案(教學(xué)內(nèi)容) } } 注意:(1)獲得數(shù)組元素的個(gè)數(shù):數(shù)組名.length; (2)一個(gè)整形數(shù)組若僅僅采用new分配空間,而沒有對(duì)其賦值,那么每個(gè)元素的值是0 注意:Java數(shù)組名是一個(gè)引用,當(dāng)將一個(gè)數(shù)組名賦值給另一個(gè)數(shù)組時(shí),實(shí)際上是名字的復(fù)制 2.5 Java中的參數(shù)傳遞方式 Java的參數(shù)傳遞的形式有兩種:基本類型按值傳遞,對(duì)象類型按引用傳遞; 通過return語句從方法中返回時(shí),基本類型總是以值的方式返回,而對(duì)象總是以引用方式返回。例如程序2-8 : class test{ int x;} public class Test_Paras { static test fun(test o,int y){ o.x=20; y=1; return o;} public static void main(String [ ] args){ test obj1 , obj2; int Val = 3; obj1=new test(); obj1.x=100; obj2=fun(obj1,Val); System.out.println(obj1.x+“ ”+ obj2.x+“ ”+Val); } } 2.6 Java的運(yùn)算符 主要包括: 算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符和三元條件運(yùn)算符。2.6.1 算術(shù)運(yùn)算符 算術(shù)運(yùn)算符:+、-、*、/、%、++和--,與C/C++基本相同。 %運(yùn)算符不但可以對(duì)整形數(shù)據(jù)運(yùn)算,而且可以對(duì)浮點(diǎn)型數(shù)據(jù)運(yùn)算。例如:3.14 % 2.5的值約等于0.64 ; 隠式數(shù)據(jù)類型轉(zhuǎn)換: 當(dāng)整型與浮點(diǎn)型數(shù)據(jù)進(jìn)行混合運(yùn)算時(shí),表達(dá)式中的數(shù)據(jù)類型會(huì)進(jìn)行相應(yīng)的自動(dòng)轉(zhuǎn)換,規(guī)則為:byte->short->int->long->float->double。 這種轉(zhuǎn)換規(guī)則也適應(yīng)于賦值語句,當(dāng)賦值符左右兩側(cè)變量類型不一致時(shí),只要轉(zhuǎn)換過程中不丟失數(shù)據(jù),便進(jìn)行自動(dòng)轉(zhuǎn)換。 class number { int x;} public class relationalOperator{ public static void main(String args[ ]){ / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) number n1,n2; n1=new number(); n2=new number(); n1.x=1; n2.x=1; if(n1.x==n2.x) System.out.println(“對(duì)象的數(shù)據(jù)成員x相等!”); if(n1==n2) System.out.println(“n1和n2是一個(gè)對(duì)象!”);else System.out.println(“n1和n2不是一個(gè)對(duì)象!”);} } 2.6.2 關(guān)系運(yùn)算符 關(guān)系運(yùn)算符不能同其它類型的變量一同 參與運(yùn)算,例如假設(shè)a,b,c是三個(gè)整形的變量,那么 a=b==c 是 正確 OR 錯(cuò)誤? ; 關(guān)系運(yùn)算符用于對(duì)象時(shí),是判別兩個(gè)引用是否代表同一個(gè)對(duì)象。而不是判斷兩個(gè)引用所指向的對(duì)象是否同屬一個(gè)類。 2.6.3 邏輯運(yùn)算符 邏輯運(yùn)算符有&&、|| 和!,分別是與、或和非。運(yùn)算結(jié)果是true或false; 邏輯運(yùn)算有求值“短路”現(xiàn)象,例如程序2-11 : public class shortCut { static boolean testOne(int x){ System.out.println(x+“ < ”+1+“ ” +(x<1)); return x < 1; } static boolean testTwo(int x){ System.out.println(x+“ < ”+1+“ ” +(x<2)); return x < 2; } public static void main(String [ ] args){ if(testOne(6)&& testTwo(1)) System.out.println(“表達(dá)式為真”); else System.out.println(“表達(dá)式為假”);} } 2.6.4 位運(yùn)算符 / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) 位運(yùn)算符:&、|、^、~、<<、>>,分別稱為位與、或、異或、左移、右移; Java引入一個(gè)專門用于邏輯右移運(yùn)算符>>>,它采用了所謂的零擴(kuò)展技術(shù),不論原值是正或負(fù),一律在高位補(bǔ)0。例如: int a=-2 , b; b=a>>>30;2.6.5 三元條件運(yùn)算符 語法格式:(exp)?(exp1):(exp2); Java要求:(exp1)與(exp2)必須同類型。2.6.6 “+”運(yùn)算符 Java對(duì)“+”進(jìn)行了重載,可以將任何類型的對(duì)象(包含原子類型)轉(zhuǎn)化為String類型。例如: int x=1; char ch='A'; double d=9.8; System.out.println(“Result: ”+x+ch+9.8);課堂練習(xí): 課外練習(xí)(作業(yè)): P32 3、4、6題。 第3章 控制語句 教學(xué)目的要求 ? 了解Java程序的結(jié)構(gòu),學(xué)習(xí)使用各種語句結(jié)構(gòu)來控制程序的流程,完成程序的功能任務(wù)。主要內(nèi)容 ? Java的分支語句; ? 循環(huán)控制語句; ? break和continue語句; ? 帶標(biāo)號(hào)的break和continue語句。 重點(diǎn)內(nèi)容 ? Java的分支語句; ? 循環(huán)控制語句; ? break和continue語句; 難點(diǎn)內(nèi)容 ? 循環(huán)控制語句; ? break和continue語句; 課時(shí)分配 3課時(shí) 教學(xué)方法 講授法、演示法、對(duì)比法、實(shí)驗(yàn)驗(yàn)證法 講授內(nèi)容提要 3.1 分支語句 / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) if-else語句; switch-case語句。3.1.1 if 語句 if語句的語法格式 同C/C++; 條件表達(dá)式必須是布爾類型,例如: 下面的寫法在C/C++中是合法的,但在Java中卻是非法的 : int i=10;if(i) ...程序3-1描述了用applet從文本框獲取數(shù)據(jù),然后將比較的結(jié)果顯示出來。 // 程序 3-1 import java.awt.*;import java.applet.*; public class compareNumbers extends Applet{ Label lab1,lab2;TextField input1,input2;int num1,num2;public void init(){ lab1=new Label(“輸入第1個(gè)整數(shù)”); input1=new TextField(10); lab2=new Label(“輸入第2個(gè)整數(shù)”); input2=new TextField(10); add(lab1); add(input1); add(lab2); add(input2);} public boolean action(Event e , Object o){ if(e.target==input1 || e.target==input2){ num1=Integer.parseInt(input1.getText()); num2=Integer.parseInt(input2.getText()); if(num1 showStatus(num1 + “ < ” + num2); else if(num1>num2) showStatus(num1+“ > ”+num2); else showStatus(num1+“ == ”+num2); } return true;} } 3.1.2 switch 語句 / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) switch語句的語法結(jié)構(gòu) 同C/C++; switch后面的表達(dá)式類型必須是字符類型或整形 ; case后面的常量不能重復(fù) ; 程序3-3采用小程序?qū)崿F(xiàn)將學(xué)生的百分制成績(jī)轉(zhuǎn)換為優(yōu)、良,中、及格和不通過五個(gè)等級(jí): // 程序3-3 import java.awt.*;import java.applet.*; public class scoreConvert extends Applet{ Label prompt;TextField input;int Excellent,Good,Middle,Pass,Failure;public void init(){ prompt=new Label(“輸入成績(jī)”); input=new TextField(2); add(prompt); add(input);} public void paint(Graphics g){ g.drawString(“各等級(jí)的人數(shù):”,25,40); g.drawString(“優(yōu)秀 : ”+Excellent,25,55); g.drawString(“良好 : ”+Good,25,70); g.drawString(“中等 : ”+Middle,25,85); g.drawString(“及格 : ”+Pass,25,100); g.drawString(“不通過: ”+Failure,25,115);} public boolean action(Event e , Object o){ int score=Integer.parseInt(input.getText()); showStatus(“"); input.setText(”“); switch(score/10){ case 10: case 9: Excellent++; break; case 8: Good++; break; case 7: Middle++; break; case 6: Pass++; break; case 5: case 4: case 3: case 2: case 1: case 0: Failure++; break; default: showStatus(”輸入有誤,重新輸入!“); } repaint(); / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) return true;} } 程序3-3需要注意的地方 在action()方法中調(diào)用的repaint()方法,是一個(gè)系統(tǒng)方法,它具有自動(dòng)調(diào)用paint()方法的能力,從而實(shí)現(xiàn)對(duì)網(wǎng)頁的刷新。3.2 循環(huán)控制語句 Java中的循環(huán)控制語句有三種,分別是:while,do-while和for語句;循環(huán)體內(nèi)的語句會(huì)反復(fù)執(zhí)行,直到控制布爾表達(dá)式的值變?yōu)閒alse為止。3.2.1 while語句 while語句格式: while(Boolean-Expression) StatementS 程序示例3-4 略 3.2.2 do-while語句 do-while語句的語法格式如下: do{ Statement }while(Boolean-Expression); 程序3-5 如下: // 產(chǎn)生一個(gè)大于0.9的隨機(jī)數(shù)為止 public class GenerateDoubleNumbers { public static void main(String args[ ]){ double d; do{ d=Math.random(); System.out.println(d); }while(d<0.9);} } 3.2.3 for語句 for語句語法格式如下: for(ForInitopt;Boolean-Expression;ForUpdateopt) Statement // 程序3-6輸出一個(gè)*三角形 public class printGraphics extends Applet{ public void paint(Graphics g){ int xpos,ypos=0; for(int row=6;row>=1;row--){ / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) xpos=25; ypos+=15; for(int column=1;column<=row;column++){ g.drawString(”*“,xpos,ypos); xpos+=7; } } } } 3.3 break語句和continue語句 3.3.1 不帶標(biāo)號(hào)的break語句和continue語句 break語句可以跳出包含它的最內(nèi)層的循環(huán),不再執(zhí)行剩余的語句; continue語句停止執(zhí)行當(dāng)前的循環(huán),回到循環(huán)處,開始執(zhí)行下一輪的循環(huán)。這些特性和C/C++的功能一樣。 for(int i=1;i<10;i++) { if(i%3==0) continue; else System.out.println(”i = “+i); } for(int i=1;i<10;i++) { if(i%3==0) break; else System.out.println(”i = “+i); } 課堂練習(xí): 1、仔細(xì)分析下面程序,寫出程序的最終運(yùn)行結(jié)果。public class s_switch { public static void main(String args[]) { int ch=8; int r=10; switch(ch-1){ case 7: r=r+3; / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) case 8: r=r+5; case 9: r=r+6;break; default:; } System.out.println(”r=“+r); } } 2、隨機(jī)產(chǎn)生26個(gè)英文字母a~z,直到大于u為止。用while和for語句實(shí)現(xiàn)。 課外練習(xí)(作業(yè)): P44 1—4 第4章 Java的類 教學(xué)目的要求 理解面向?qū)ο缶幊痰幕靖拍?了解類的封裝方法 如何創(chuàng)建類和對(duì)象 了解成員變量和成員方法的特性 學(xué)習(xí)使用OOP方式進(jìn)行程序設(shè)計(jì) 深刻理解類的繼承性和多態(tài)性 主要內(nèi)容 ? 類的定義和使用; ? 方法的定義和使用; ? 實(shí)例變量和局部變量; ? 構(gòu)造方法; ? 方法的覆蓋和重載; ? 關(guān)鍵字this的用法; ? 繼承的概念和應(yīng)用; ? 組合與繼承; ? 抽象方法和抽象類; ? 對(duì)象類型轉(zhuǎn)換; ? 訪問權(quán)限限制符:public、private、protected。 重點(diǎn)內(nèi)容 ? 類的定義和使用; ? 方法的定義和使用; ? 構(gòu)造方法; ? 方法的覆蓋和重載; ? 關(guān)鍵字this的用法; ? 繼承的概念和應(yīng)用; / 87 ? ? ? ? ? ? 大理學(xué)院課程教案(教學(xué)內(nèi)容) ? 組合與繼承; ? 抽象方法和抽象類; ? 對(duì)象類型轉(zhuǎn)換; 難點(diǎn)內(nèi)容 ? 構(gòu)造方法; ? 方法的覆蓋和重載; ? 繼承的概念和應(yīng)用; ? 組合與繼承; ? 抽象方法和抽象類 課時(shí)分配 8課時(shí) 教學(xué)方法 講授法、演示法、對(duì)比法、實(shí)驗(yàn)驗(yàn)證法、學(xué)生討論法 講授內(nèi)容提要 4.1 類與對(duì)象 在Java程序中,除原子類型的變量以外都是對(duì)象,連Java程序本身也不例外。 類是面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ),OO始終是圍繞著對(duì)象的封裝性、繼承性和多態(tài)性展開討論的。4.1.1 類與對(duì)象的區(qū)別 類是一個(gè)抽象的概念,對(duì)象是一個(gè)具體的概念。 類是在一組對(duì)象的基礎(chǔ)上,通過抽象和概括獲得的一個(gè)概念。 對(duì)象是由數(shù)據(jù)和方法緊密結(jié)合的一個(gè)封裝體,具有信息隱藏的能力。 對(duì)象可以通過方法(函數(shù))與其它對(duì)象進(jìn)行通信,但并不知道這些方法的實(shí)現(xiàn)細(xì)節(jié)。4.1.2 Java和C編程思想的區(qū)別 C是結(jié)構(gòu)化的編程語言,以函數(shù)為編程單元,程序員把注意力集中在編寫函數(shù)上。Java是面向?qū)ο蟮木幊陶Z言,以類為編程單元,程序員的精力集中在對(duì)類的設(shè)計(jì)上。 對(duì)象將實(shí)例變量(instance variable)和對(duì)數(shù)據(jù)的操作(即方法)約束在一起,類似一個(gè)獨(dú)立的程序,易于擴(kuò)充,易于維護(hù),代碼可復(fù)用。4.1.3 如何定義類 類是對(duì)象的模板,它定義了對(duì)象的結(jié)構(gòu)和操作數(shù)據(jù)的方法。public class Sayhello extends Applet { public void paint(Graphics g){ int xPos=35; int yPos=30; g.drawString(”Hello Java!“,xPos,yPos); } } 定義類的通用格式如下: class className extends superClassName{ type instance-vairbale1; return-type methodName1(parameter-list){ method-body;} / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) } public class Hello { public static void main(String args[ ]){ System.out.println(”Hello Java!“); } } 系統(tǒng)類Object是整個(gè)類層次結(jié)構(gòu)中的根。如果我們要定義Object的子類,可以不指明extends Object,默認(rèn)情況下一個(gè)類就是Object類的子類。類內(nèi)定義的變量稱為實(shí)例變量,函數(shù)稱為方法; Java將類的定義和類的實(shí)現(xiàn)放在一起,便于系統(tǒng)維護(hù)。例如: class point { // Object類的子類 int x , y; void init(int a, int b){ int i=0; x=a; y=b; } } 4.1.4 對(duì)象和引用 對(duì)象是客觀存在的變量,對(duì)象的引用就是對(duì)象的名字,例如:Point p1;創(chuàng)建對(duì)象:p1=new Point(); 一個(gè)對(duì)象可以有多個(gè)別名; p2=p1;將一個(gè)變量設(shè)置為null,表明該變量不代表任何對(duì)象 : p1 = null; 每個(gè)對(duì)象都有自己的變量,改變一個(gè)對(duì)象的實(shí)例變量并不影響到另外一個(gè)對(duì)象。例如: class Point { // 程序4-1 int x , y; void init(int a, int b){ x=a; y=b; } } public class TwoPoint{ public static void main(String [ ]args){ Point p1= new Point(), p2= new Point(); p1.x=10;p1.y=20; p2.x=30;p2.y=40;System.out.println(”x = “+ p1.x +” y= “+p1.y);System.out.println(”x = “+ p2.x +” y= “+p2.y); } } 4.2 方法 方法是一個(gè)功能模塊,類似C中的函數(shù); 方法和實(shí)例變量都必須定義在類內(nèi),方法是類的功能接口 ; 定義方法的原則:方法應(yīng)當(dāng)只執(zhí)行單一的任務(wù),并且方法名能有效地表達(dá)該任務(wù); / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) 方法的返回值類型、方法名和參數(shù)表共同稱之為方法的特征。調(diào)用方法的格式:引用.方法名(參數(shù)表);例如: Point p1=new point(),p2=new point();Point p3=p2;p1.init(10,20);//僅對(duì)p1對(duì)象的x和y進(jìn)行賦值 p2.init(30,40);//僅對(duì)p2對(duì)象的x和y進(jìn)行賦值 對(duì)象是客觀存在的變量,對(duì)象的引用就是對(duì)象的名字,例如:point p1;創(chuàng)建對(duì)象:p1=new point(); 一個(gè)對(duì)象可以有多個(gè)別名; p2=p1;將一個(gè)變量設(shè)置為null,表明該變量不代表任何對(duì)象 : p1 = null; 每個(gè)對(duì)象都有自己的變量,改變一個(gè)對(duì)象的實(shí)例變量并不影響到另外一個(gè)對(duì)象。 4.3 實(shí)例變量和局部變量 class Loc { // 程序4-2 int x=1;// 實(shí)例變量 void printLocVar(){ int x=25;// 局部變量 System.out.println(”n x is :“+x); ++x; System.out.println(” x is :“+x);} void printInstanceVar(){ System.out.println(”n x is :“+x); x*=10; System.out.println(x is :”+x);} } public class TestInstanceVar { // 程序的主類 public static void main(String args[ ]){ loc obj=new Loc(); int x=5; // 局部變量 x System.out.println(“ x is :”+x); obj.printLocVar(); obj.printInstanceVar(); System.out.println(“ x is :”+x);} } 4.3 實(shí)例變量和局部變量 Java中的變量分為兩種:類內(nèi)定義的實(shí)例變量,方法中定義的局部變量。 在同一個(gè)作用域內(nèi),不允許定義兩個(gè)同名的局部變量。 局部變量可以掩蓋實(shí)例變量。 / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) 實(shí)例變量屬于對(duì)象,它描述了對(duì)象的屬性,隨著對(duì)象的存在而存在; 局部變量是隨著方法的調(diào)用而存在,一旦方法調(diào)用結(jié)束,局部變量也就消亡了。4.4 構(gòu)造方法 構(gòu)造方法的功能是在創(chuàng)建對(duì)象時(shí)初始化對(duì)象的實(shí)例變量; 討論:構(gòu)造方法的特點(diǎn): 無返回值,無void 方法名與類名相同 僅在創(chuàng)建對(duì)象時(shí)調(diào)用 class point { // 程序4-3 int x, y;point(int a, int b){ x=a;y=b;} } public class createPoint { public static void main(String args[ ]){ point p= new point(10,20); System.out.println(p.x +“ ”+p.y);} } 如果類中沒有定義構(gòu)造方法,編譯器會(huì)自動(dòng)創(chuàng)建一個(gè)缺省的、不帶參數(shù)的構(gòu)造方法。構(gòu)造方法是在對(duì)象創(chuàng)建之后,new操作完成前被調(diào)用的。4.5 方法重載 方法重載是在一個(gè)類中定義二個(gè)或多個(gè)同名的方法,但方法的參數(shù)個(gè)數(shù)或類型不完全相同;例如: class point { int x, y;point(int a, int b){ x=a;y=b;} point(){ x=-1;y=-1;} point(double a, int b){ x=(double)a;y=b;} } 方法重載的一個(gè)誤區(qū):是靠返回值區(qū)別重載,即定義多個(gè)方法,它們的名稱和形參類型完全相同,但返回值不同,這是不允許的; 4.6 關(guān)鍵字this this指代對(duì)象,是對(duì)當(dāng)前對(duì)象的一個(gè)引用。例如: class IntVector { // 程序4-6 int v[ ]; boolean equals(IntVector other){ if(this == other)return true; return false;} } class testIntVector { / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) public static void main(String args[ ]){ IntVector t1=new IntVector(),t3=new IntVector(),t2=t1; System.out.println(t1.equals(t2)); System.out.println(t3.equals(t2)); } } Java中的級(jí)連調(diào)用,仍是指代當(dāng)前對(duì)象的this。例如:// 程序4-7 import java.awt.*;import java.applet.*; class time{ private int hour, min, sec; time(){ setHour(0);setMin(0);setSec(0);} time setHour(int h){ hour=((h>=0 && h<24)? h: 0); return this;} time setMin(int m){ min=((m>=0 && m<60)? m: 0); return this;} time setSec(int s){ sec=((s>=0 && s<60)? s: 0); return this;} String tostring(){ return hour+“:”+min+“:”+sec;} public class timeToString extends Applet{ private time t; public void init(){ t=new time();} public void paint(Graphics g){ t.setHour(18).setMin(30).setSec(20); / 87 } 大理學(xué)院課程教案(教學(xué)內(nèi)容) g.drawString(“ time:”+t.tostring(),25,45);} } 在構(gòu)造方法內(nèi)部使用this,它用于指代另外一個(gè)構(gòu)造方法,但不能指代非構(gòu)造方法。例如: class point { int x, y; point(){ this(-1,-1);} point(int a, int b){ x=a;y=b;} } 4.7 繼承 繼承是軟件重用的一種形式,可以提高系統(tǒng)的性能; 繼承語法: class className extends superClassName{ 各實(shí)例變量和方法的定義 } 例如: class point{ int x, y; point(int x, int y){ this.x=x;this.y=y;} point(){ this.x=0; this.y=0;} } class circle extends point{ int radius; circle(int r, int x, int y){ radius=r; this.x=x; this.y=y; } } Java不支持多繼承,但支持多接口; 子類的對(duì)象也是其超類的對(duì)象,反之未必; 繼承具有傳遞性: B繼承于A,C又繼承于B,則C也繼承了A中的實(shí)例變量和方法。關(guān)鍵字super 構(gòu)造方法是一種特殊的方法,子類不能繼承超類的構(gòu)造方法,但子類構(gòu)造方法可以通過super調(diào)用超類的構(gòu)造方法。 當(dāng)創(chuàng)建子類對(duì)象時(shí),首先執(zhí)行超類構(gòu)造方法,然后執(zhí)行子類的構(gòu)造方法。例如: class point{ // 程序4-8 int x, y; point(int x, int y){ / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) this.x=x;this.y=y; System.out.println(“父類構(gòu)造函數(shù)被調(diào)用!”); } } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r; System.out.println(“子類構(gòu)造函數(shù)被調(diào)用!”); } } public class testInherence { public static void main(String args[ ]){ circle c1; c1=new circle(1,1,1); } } 再次討論構(gòu)造方法 若父類沒有定義構(gòu)造方法,那么對(duì)父類數(shù)據(jù)的初始化將采用系統(tǒng)缺省的構(gòu)造方法;例如: class point{ int x, y; } class circle extends point{ int radius; circle(int r, int x, int y){ this.x=x; this.y=y; radius=r; } } 若父類定義有缺省構(gòu)造方法,那么子類可根據(jù)自己的需要設(shè)置自己的構(gòu)造方法。例如: class point{ int x, y; point(){ this(0,0); } point(int x, int y){ this.x=x;this.y=y; } } class circle extends point{ // 注意子類的構(gòu)造函數(shù) int radius; circle(int r, int x, int y){ radius=r;} } 若父類定義的構(gòu)造方法都是有參的,那么子類構(gòu)造方法必須通過super調(diào)用父類構(gòu)造方法,class point{ private int x, y; point(int x, int y){ / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) this.x=x; this.y=y; } } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r; } } 4.8 方法的覆蓋 方法的覆蓋發(fā)生在父類和子類之間,若子類中定義的某個(gè)方法的特征,與父類中定義的某個(gè)方法的特征完全一樣,那么就說子類中的這個(gè)方法覆蓋了父類對(duì)應(yīng)的那個(gè)方法。4.8.1 覆蓋與重載的區(qū)別 重載可以出現(xiàn)在一個(gè)類中,也可以出現(xiàn)在父類與子類的繼承關(guān)系中,并且重載方法的特征一定不完全相同。 覆蓋特點(diǎn):子類中的方法特征與父類定義的對(duì)應(yīng)方法的特征完全一樣。例如: // 程序4-9 class point{ int x, y; point(){ this(0,0);} point(int x, int y){ this.x=x;this.y=y; } double area(){ return 0;} } class circle extends point{ int radius; circle(int r, int x, int y){super(x, y); radius=r; } double area(){ return Math.PI*radius*radius;} } public class testOverWrite { public static void main(String args[ ]){ circle c1; c1=new circle(1,1,1); System.out.println(c1.area()); } } 4.8.2 方法的動(dòng)態(tài)調(diào)用 Java的所有對(duì)象運(yùn)行時(shí)都有一個(gè)類型標(biāo)識(shí)(RTTI:Run-Time Type Identification),該標(biāo)識(shí)記錄了每個(gè)對(duì)象所屬于的類。Java用此標(biāo)識(shí)在運(yùn)行時(shí)選擇正確的方法。例如: // 程序4-11 / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) class point{ int x, y; point(){ this(0,0);} point(int x, int y){ this.x=x;this.y=y; } double area(){ return 0;} } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r;} double area(){ // 覆蓋了父類的area方法 return Math.PI*radius*radius; } } public class dynamicalCall { public static void main(String args[ ]){ point p[ ]={new point(2,2), new circle(1,1,1)}; for(int i=0;i System.out.print(“類名: ”+ p[i].getClass().getName()); System.out.print(“父類:”+ p[i].getClass().getSuperclass()); System.out.println(“ 面積: ”+ p[i].area()); } } } 子類對(duì)象調(diào)用方法時(shí): (1)子類檢查是否具有同名和同參數(shù)類型的方法,若有則調(diào)用該方法,否則繼續(xù)執(zhí)行。 (2)到父類中尋找同名和同參數(shù)類型的方法,若有則調(diào)用該方法。若找不到,將產(chǎn)生編譯錯(cuò)誤。 對(duì)象決定自己到底該調(diào)用哪個(gè)方法,取決于該對(duì)象在繼承鏈中的位置。 4.9 多態(tài)性不適合繼承鏈中的實(shí)例變量 引用.方法:根據(jù)多態(tài)性調(diào)用; 引用.實(shí)例變量:根據(jù)引用的類型調(diào)用。即:多態(tài)性僅僅適用于方法的調(diào)用,而不適合實(shí)例變量。例如: class Base{ // 程序4-12 int x=1;void print(){ System.out.println(“當(dāng)前類為 ”+ this.getClass().getName()); / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) System.out.println(“對(duì)象的x= ”+this.x); } } class Derived extends Base{ int x=2;void print(){ System.out.println(“當(dāng)前類為 ”+ this.getClass().getName()); System.out.println(“對(duì)象的x= ”+this.x); } } public class confusions{ public static void main(String [ ] args){ Base obj=new Derived(); obj.print(); System.out.println(“對(duì)象的x= ”+obj.x); } } 4.10 finalize Java的垃圾回收器具有自動(dòng)回收垃圾的能力。 垃圾回收器是一個(gè)優(yōu)先級(jí)比較低的線程,在系統(tǒng)空閑時(shí)運(yùn)行。 在對(duì)象被回收之前,有時(shí)需要執(zhí)行一些特殊的操作,例如保存文件、清除屏幕等,這時(shí)就要用Java的finalize方法。例如: class point{ // 程序4-13 int x, y; point(int a, int b){ x=a;y=b; System.out.println(“point constructor:”+getString()); } public void finalize(){ // 注意該方法 System.out.println(“point finalizer:”+getString()); } String getString(){ return “x=”+x+“ y=”+y; } } class circle extends point{ int radius; / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) circle(int r, int a, int b){ super(a,b);radius=r;System.out.println(“circle constructor:”+getString()); } public void finalize(){ System.out.println(“circle finalizer:”+getString()); } String getString(){ return super.getString()+“ radius=”+radius; } } public class testFinalize { public static void main(String args[ ]){ point c1,c2;c1=new circle(1,1,1); c2=new circle(2,2,2); c1=null; c2=null;System.gc(); } } 4.11 static static修飾變量(與C中的不同); static修飾方法(與C中的不同); 4.11.1 static變量 static變量是指這樣的成員變量:不管在程序運(yùn)行中生成多少個(gè)該類的對(duì)象,它們都共享該變量。即使沒有創(chuàng)建對(duì)象,該變量仍然存在。因此,static變量又稱為類變量。定義格式為:static type variableName; static變量和一般的實(shí)例變量不同,在構(gòu)造方法中不能對(duì)它進(jìn)行初始化。例如: class point{ // 程序4-14 static int count;int x, y; static{ // 靜態(tài)初始化塊 count=0; System.out.println(“static variable is initialized!”); } point(int a, int b){ / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) count++; x=a; y=b; System.out.println(“Call point constructor!”);} } public class testStaticVariable { public static void main(String args[ ]){ point c1=new point(0,0); System.out.println(“There are ”+ point.count +“ points”); } } 4.11.2 static方法 (可舉例說明Math類的PI和sqrt等,為什么要用靜態(tài)變量。)static方法是類中的成員方法,它屬于整個(gè)類,即使不創(chuàng)建任何對(duì)象,也可使用靜態(tài)方法。調(diào)用靜態(tài)方法格式:類名.方法名(參數(shù)); 在子類中不能覆蓋父類中定義的靜態(tài)方法。 靜態(tài)方法中只能出現(xiàn)靜態(tài)變量和其它靜態(tài)方法。并且還不能使用this和super。例如: class point{ // 程序4-15 static int count;// 定義靜態(tài)變量 int x, y; static{ count=0;System.out.println(“static variable is initialized!”); } point(int a, int b){ count++; x=a;y=b; System.out.println(“Call point constructor!”); } static int getCount(){ // 靜態(tài)方法 return count; } } public class testStaticMethod { public static void main(String args[ ]){ point c1=new point(0,0);point c2=new point(1,1); System.out.println(“There are ”+ point.getCount()+“ points”);} / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) } 4.12 關(guān)鍵字final 在實(shí)例變量、局部變量和方法的形參定義之前加上final,那么這個(gè)變量值只能被引用,而不能修改。 final修飾的局部變量和實(shí)例變量必須給出初值,因?yàn)樗揎椀淖兞看硪粋€(gè)常量。例如: class Base{ // 程序4-16 final int x=1; // 形式1:修飾實(shí)例變量 void print(final int y){ // 形式2:修飾參數(shù) // y=0; // 錯(cuò)誤 System.out.println(x+y); } } public class finalVariables{ public static void main(String [ ] args){ final int var=100;// 形式3:修飾局部變量 Base obj=new Base(); obj.print(var);} } 在方法定義前加上final,該方法就不能被子類覆蓋,成為終極方法 ; 包含終極方法的類仍然可以被子類繼承,子類雖然不能覆蓋父類中的終極方法,但可以重載該方法。例如: class Base{ final int x=1; final void print(int y){ // 父類中的final方法 System.out.println(x+y); } } class Derived extends Base { void print(){ // 重載了父類中的print方法 System.out.println(x); } } 4.12.3 final類 在一個(gè)類定義前加上final,意味著這個(gè)類就不能被其它類繼承,成為終極類。 系統(tǒng)類基本上都是final類,如String類。 / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) 將class定義為final是為了杜絕繼承,類中的方法自然都變成了終極方法。例如: final class Base{ // 聲明為final類 final int x=1; void print(final int y){ System.out.println(x+y); } } // 錯(cuò)誤:不能繼承final 修飾的Base類 class Derived extends Base { } 4.13 組合與繼承 面向?qū)ο笾械能浖赜帽憩F(xiàn)為兩種形式:繼承和對(duì)象組合。 設(shè)計(jì)這類程序的關(guān)鍵是構(gòu)造方法:子類構(gòu)造方法調(diào)用父類構(gòu)造、成員對(duì)象的初始化。class date{ // 程序4-17 int year, mon,day; date(int y, int m, int d){ year=y; mon=(m>0 && m<13)?m:1;day=checkday(d); } int checkday(int d){ int daydisp[ ]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if(d>0 && d<=daydisp[mon]) return d; if(mon==2 && d==29 &&(year%400==0 || year%4==0&& year%100!=0)) return d; return 1; } String tostring(){ return year+“/”+mon+“/”+day;} } class employee{ // 雇員類 long id;date birthday; employee(long no, int year, int mon, int day){ id=no; // 設(shè)置組合對(duì)象 birthday=new date(year,mon,day);} / 87 例如: 大理學(xué)院課程教案(教學(xué)內(nèi)容) String tostring(){ return id+“ , ”+birthday.tostring();} } class manager extends employee { // 經(jīng)理類 double basePay; manager(long no, int y, int m, int d){ super(no,y,m,d); // 調(diào)用父類構(gòu)造函數(shù) basePay=1000;} String tostring(){ return basePay+“ , ”+super.tostring();} } public class compositionAndInherence { public static void main(String [ ] args){ manager boss; boss=new manager(1001,1971,11,5); System.out.println(boss.tostring()); } } 4.14 抽象類和抽象方法 抽象方法:僅有方法特征,但沒有代碼; 抽象類:包含抽象方法的類。 抽象類的作用:提供一種適當(dāng)?shù)某?,子類通過繼承實(shí)現(xiàn)父類中的抽象方法。 抽象類不能用final修飾。 抽象類體現(xiàn)了多態(tài)性,通過繼承可以從抽象類派生出具有相似操作的子類。例如: abstract instrument abstract void play()繼承 wind void play()繼承 繼承 stringed void play()percussion void play()繼承 繼承 woodwind void play()brass void play() // 程序4-18 / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) abstract class instrument{ abstract void play();// 抽象方法 } // wind不是抽象類 class wind extends instrument{ void play(){ System.out.println(“wind play!”);} } // percussion也不是抽象類 class percussion extends instrument{ void play(){ System.out.println(“percussion play!”);} } // stringed也不是抽象類 class stringed extends instrument{ void play(){ System.out.println(“stringed play!”);} } class woodWind extends wind{ // 覆蓋父類中的play方法 void play(){System.out.println(“woodWind play!”);} } class brass extends wind{ // 覆蓋了父類中的play方法 void play(){ System.out.println(“brass play!”);} } public class music { static void tuneAll(instrument e[ ]){ for(int i=0;i e[i].play();} public static void main(String [ ] args){ instrument orchestra[ ] = new instrument[5]; int i=0; orchestra[i++]=new wind(); orchestra[i++]=new percussion(); orchestra[i++]=new stringed(); orchestra[i++]=new woodWind(); orchestra[i++]=new brass(); tuneAll(orchestra); } } 程序運(yùn)行結(jié)果: wind play!percussion play! / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) stringed play!woodWind play!brass play! 4.15 對(duì)象的類型轉(zhuǎn)換 4.15.1 向上類型轉(zhuǎn)換 從子類向父類轉(zhuǎn)換,在繼承圖中是向上移動(dòng),通常稱為向上類型轉(zhuǎn)換。類型向上轉(zhuǎn)換是安全的,因?yàn)檫@是從特殊類型到通用類型的轉(zhuǎn)換。 進(jìn)行向上類型轉(zhuǎn)換時(shí),出現(xiàn)的唯一問題是可能丟失子類中定義的方法和變量。例如: // 程序4-19 class point{ int x, y; point(int x, int y){ this.x=x;this.y=y;} int getX(){ return x;} } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y);radius=r;} double area(){ return Math.PI*radius*radius; } } public class testUpCasting { public static void main(String [ ] args){ circle c=new circle(1,1,1); point p=c;// 注意:p和c的類型不同 } System.out.println(p.getX()); } 4.15.2 向下類型轉(zhuǎn)換 從父類向子類轉(zhuǎn)換,在繼承圖中是向下移動(dòng),稱為向下類型轉(zhuǎn)換。 類型向下轉(zhuǎn)換是不安全的,因?yàn)檫@是從一般類型到特殊類型的轉(zhuǎn)換。例如: public static void main(String [ ] args){ point p=new point(1,1);circle c;c=p; //注意:此處編譯時(shí)出錯(cuò) c=(circle)p;//注意:此處運(yùn)行時(shí)出錯(cuò) System.out.println(c.area()); } / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) 4.16 訪問權(quán)限限制 Java提供的訪問權(quán)限修飾符有四個(gè),即public、private、protected和友元; 修飾符要置于每個(gè)類成員(實(shí)例變量和成員方法)的定義之前,且僅能控制它所修飾的那個(gè)成員。4.16.1 友員 缺省修飾符的情況就是友員。友員修飾符意味著同一個(gè)目錄(包)中的所有類都可以訪問這種類型的成員。 friendly不屬于Java關(guān)鍵字,是C++的一個(gè)關(guān)鍵字。 例如: public class Base{ // 該類位于Base.java文件中 int friend_data=1;// 友員數(shù)據(jù)成員 } // 該類位于Derived.java文件中 public class Derived extends Base{ Base p=new Base(); // 訪問Base類中的friend_data void dataUse(){ System.out.println(“data=”+p.friend_data); } } 4.16.2 public 成員 不管兩個(gè)類是否位于同一個(gè)目錄中,一個(gè)類總可以訪問另一個(gè)類的public成員。 public還可以用于修飾主類,文件名必須與主類名一致。除此之外,其它3個(gè)修飾符都不能用于修飾類,只能修飾成員。例如: public class Base{ public int friend_data=1;// public成員 } public class Derived extends Base{ public Base p=new Base(); public void dataUse(){ System.out.println(“data=”+p.friend_data); } } 4.16.3 private成員 private成員的特性:除了其所在類能夠訪問該成員以外,其它類都不能訪問它。 在多人合作開發(fā)一個(gè)系統(tǒng)的過程中,private可以讓你自由使用自己定義的成員,無須擔(dān)心與其他人 / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) 寫的類相沖突。例如: // 程序4-20 class Base{ private Base(){ } // 注意 static Base makeBase(){ return new Base();} } public class testPrivate { public static void main(String args[ ]){ // Base p=new Base(); // 編譯有錯(cuò) Base p = Base.makeBase();} } 4.16.4 protected成員 protected與繼承有關(guān),這種類型的成員可以被子類訪問。 同一個(gè)包內(nèi)的非子類,也可以訪問這種類型的成員。即:protected天生就具有友元權(quán)限,例如: // 程序4-21 class Base{ // 該類位于Base.java文件中 int friend_data=1; // 友元成員 public int public_data=2;// public成員 private int private_data=3;// private成員 protected int protected_data=4;// protected成員 } class Derived extends Base{ // Derived.java文件 Base a=new Base(); void dataUse(){ System.out.println(a.friend_data); System.out.println(a.public_data); // System.out.println(a.private_data); System.out.println(a.protected_data);} } // 將主類存放在testData.java文件中 public class testData { public static void main(String args[ ]){ Derived d=new Derived(); d.dataUse(); } } 訪問權(quán)限總結(jié) / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) 課堂練習(xí): 1、定義一個(gè)Student類: 該類的功能有:可以保存、修改和獲取學(xué)生的姓名、學(xué)號(hào)等??梢栽O(shè)置學(xué)生的英語成績(jī)、數(shù)學(xué)成績(jī)、Java成績(jī),并能計(jì)算平均分、最高分和最低分。 2、以下代碼定義了一個(gè)類,請(qǐng)指出其中三條不合法的代碼行(行號(hào)參見注釋)。 class Test22{ //1 float u; //2 static float v; //3 static void setUV(boolean f){ //4 u=fac1(f); //5 v=fac2(!f); //6 } //7 static float fac1(boolean f){ return f?u:v;} //8 float fac2(boolean f){ return f?u:v;} //9 } 課外練習(xí)(作業(yè)): P87 1、3、4、6 第5章 接口和包 教學(xué)目的要求 ? 掌握接口的定義和使用 ? 了解接口與抽象類的異同點(diǎn) ? 掌握包的定義和使用 主要內(nèi)容 ? 接口的定義和使用 ? 包的定義和使用 重點(diǎn)內(nèi)容 ? 接口的定義和使用 ? 包的定義和使用 難點(diǎn)內(nèi)容 無 課時(shí)分配 / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) 1課時(shí) 教學(xué)方法 講授法、演示法 講授內(nèi)容提要 5.1 接口 引入接口的原因:在程序設(shè)計(jì)中經(jīng)常遇到這樣一個(gè)問題:有些類互不相關(guān),但卻具有相似的方法。并且這些方法在各個(gè)類中的實(shí)現(xiàn)互不相同。我們不能為這些類定義一個(gè)共同的父類,但又希望在程序中體現(xiàn)出它們共同的接口。5.1.1 接口的定義和應(yīng)用 接口是一系列常量和空方法的集合,它提供了多個(gè)類共同的方法,但不限制每個(gè)類如何實(shí)現(xiàn)這些方法。 Java允許一個(gè)類同時(shí)實(shí)現(xiàn)多個(gè)接口,相當(dāng)于實(shí)現(xiàn)多繼承的功能。聲明一個(gè)接口的語法格式: [public] interface interfaceName [extends super-interface-List]{ type ConstantName=value; type MethodName(Parameter lists);} 例如: interface Sortable{ // 定義一個(gè)接口 int Compare(Sortable s);} 接口中不能聲明任何變量和構(gòu)造方法。 如果一個(gè)類實(shí)現(xiàn)多個(gè)接口,應(yīng)該在接口名之間用逗號(hào)隔開。 當(dāng)一個(gè)類實(shí)現(xiàn)接口時(shí),必須實(shí)現(xiàn)接口中給出的空方法,若實(shí)現(xiàn)接口的類是一個(gè)抽象類,可以把實(shí)現(xiàn)接口的任務(wù)交給子類去實(shí)現(xiàn)。例如: // 程序5-1 interface Sortable{ // 定義一個(gè)接口 int Compare(Sortable s);} class Sort{ // 定義一個(gè)排序類,僅有一個(gè)靜態(tài)的方法 public static void SelectSort(Sortable a[ ]){ int i, j, k;Sortable temp; for(i=0;i // 選擇排序 k=i; for(j=i+1;j if(a[k].Compare(a[j])<0)k=j; temp=a[i];a[i]=a[k];a[k]=temp;} } } class Student implements Sortable{ // 定義一個(gè)學(xué)生類 private int score; / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) Student(int x){ score=x;} // 實(shí)現(xiàn)接口Sortable中的方法 public int Compare(Sortable s){ Student st=(Student)s; // 類型強(qiáng)制轉(zhuǎn)換 return score-st.score; } public String toString(){ return “score=”+score;} } class Rectangle implements Sortable{ // 矩形類也實(shí)現(xiàn)了接口 private int length,width; Rectangle(int x,int y){ length=x;width=y;} int area(){return length*width;} public int Compare(Sortable s){ // 實(shí)現(xiàn)接口 Rectangle rec=(Rectangle)s; // 類型強(qiáng)制轉(zhuǎn)換 return area()-rec.area(); } public String toString(){ return “area=”+area();} } public class interfaceTest { public static void main(String args[ ]){ Student stud[ ]=new Student[20];int i; for(i=0;i stud[i]=new Student((int)(Math.random()*100));Sort.SelectSort(stud); // 排序 for(i=0;i System.out.println(stud[i].toString()); Rectangle R[ ]=new Rectangle[10]; for(i=0;i R[i]=newRectangle((int)(Math.random()*10),(int)(Math.random()*10));Sort.SelectSort(R); // 排序 for(i=0;i System.out.println(R[i].toString()); / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) } } 接口中定義的變量實(shí)際上是常量,必須給出它們的初始值,實(shí)現(xiàn)接口的類可以自由引用這些常量。例如: // 程序5-2的部分 interface constant { int EXCELLENT=5;int GOOD=4;int PASS=3;int FAIL=2;} 在類中實(shí)現(xiàn)接口中方法時(shí),方法的特征必須和接口中聲明的方法特征保持一致; 實(shí)現(xiàn)方法時(shí)必須在方法前加上public; 若一個(gè)類沒有對(duì)接口中的方法具體實(shí)現(xiàn),那么必須將該類聲明為abstract類。例如: interface inter { // 接口 void methodA();} abstract class Derived1 implements inter { // 此處不需要寫出methodA()的原型 } class Derived2 extends Derived1{ public void methodA(){ // 實(shí)現(xiàn)方法 System.out.println(“Hi,methodA”); } } 5.1.2 接口和抽象類的異同點(diǎn) 接口和抽象類的相同點(diǎn): (1)都有空的方法,都必須在子類中實(shí)現(xiàn)這些方法。 (2)都不能用new關(guān)鍵字來創(chuàng)建這兩種類型的對(duì)象。 (3)都可以具有繼承關(guān)系。 (4)接口和類一樣可以具有public屬性。接口和抽象類的不同點(diǎn): (1)在抽象類中,空的方法必須加abstract關(guān)鍵字,而在接口中不需要。 (2)在抽象類中,除空的方法外,可以定義實(shí)例變量和非空的方法,而在接口中,只能定義常量和空的方法。 (3)接口允許多繼承,類僅支持單繼承。 5.2 包 在Java中可以將自己寫的類,按一定的方法歸屬于不同的子目錄中(包)。 在缺省情況下,Java將所有的類歸屬一個(gè)缺省包中。在不同的包中可以有同名的類存在。 / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) Java中的包與C++中的名字空間相似。5.2.1 package語句 package語句告訴編譯器當(dāng)前類屬于哪個(gè)包。如果沒有package語句,類就存放在無名的缺省包中(即當(dāng)前目錄中)。 引進(jìn)包的概念主要是為了名字沖突。 格式: package pkgl[.pkg2[.pkg3]]; 5.2.2 import語句 import語句位于package語句之后,類的定義之前;格式:import package1[.package2].(class-name | *); 采用*號(hào)不影響程序的運(yùn)行性能,但會(huì)影響編譯速度。指明具體類比引入整個(gè)包更為合理。5.2.3 包應(yīng)用舉例 package Base; // 將該類存放在d:myjavaBase包中 public class Base { int friend_data=1;// 友元成員 public int public_data=2;// public成員 private int private_data=3;// private成員 protected int protected_data=4;// protected成員 } package Derived; // 將Base類存放在Derived包中 import Base.*;// 需要使用Base包中的類 public class Derived extends Base{ Base a=new Base(); // 為了讓testData類能調(diào)用該方法,修改為public public void dataUse(){ // System.out.println(a.friend_data); // 不能訪問 System.out.println(a.public_data); // System.out.println(a.private_data); // 不能訪問 // System.out.println(a.protected_data);// 不能訪問 } } // testData.java文件的內(nèi)容如下: import Derived.*; //需要使用Derived包中的類 // 該類位于工作目錄,不需要package語句 public class testData { public static void main(String args[ ]){ Derived d=new Derived(); d.dataUse(); } } / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) 課堂練習(xí): 課外練習(xí)(作業(yè)): P108 3~6 第6章 字符串處理 教學(xué)目的要求 掌握字符串的分類; 掌握內(nèi)容不可改變的字符串類String; 掌握字符串常量; 掌握內(nèi)容可以改變的字符串類StringBuffer; 掌握字符串應(yīng)用。 主要內(nèi)容 ? 字符串的分類; ? 內(nèi)容不可改變的字符串類String; ? 字符串常量; ? 內(nèi)容可以改變的字符串類StringBuffer; ? 字符串應(yīng)用。 重點(diǎn)內(nèi)容 ? 掌握內(nèi)容不可改變的字符串類String; ? 掌握內(nèi)容可以改變的字符串類StringBuffer; ? 掌握字符串應(yīng)用。 難點(diǎn)內(nèi)容 String和StringBuffer的區(qū)別和聯(lián)系 課時(shí)分配 2課時(shí) 教學(xué)方法 講授法、演示法、對(duì)比法、實(shí)驗(yàn)驗(yàn)證法 講授內(nèi)容提要 6.1 字符串的分類 java.lang包中定義了 String和StringBuffer兩個(gè)類; 在運(yùn)行中值不會(huì)改變的字符串,用String類存儲(chǔ);值會(huì)改變的字符串用StringBuffer類來存儲(chǔ)。兩個(gè)類都有final修飾,這樣可以優(yōu)化字符串的操作。 6.2 String類 String類的定義原型 : public final class java.lang.String extends java.lang.Object { … } 6.2.1 字符串常量 / 87 ? ? ? ? ? 大理學(xué)院課程教案(教學(xué)內(nèi)容) 字符串常量屬于String類型;相同的字符串常量屬于同一個(gè)對(duì)象,占用同一塊空間,例如: // 程序6-1 public class TestConstString{ public static void main(String args[ ]){ String str1=“Hello”, str2=“Hello”; System.out.println(str1==str2); System.out.println(“Java”==“Java”);} } 6.2.2 創(chuàng)建String類對(duì)象 用new運(yùn)算符,并調(diào)用構(gòu)造函數(shù)創(chuàng)建這種類型的對(duì)象,常見構(gòu)造函數(shù)如下: 1.public String()采用該構(gòu)造函數(shù)創(chuàng)建一個(gè)不含字符的空對(duì)象。例如: String str =new String(); 2.public String(char value[ ]) 將字符數(shù)組的內(nèi)容轉(zhuǎn)換為字符串,并賦予新建的對(duì)象。例如: char a[ ]={'J','a','v','a'}; String str=new String(a);3.public String(char value[ ], int offset, int count) 例如:char a[ ]={'J','a','v','a'}; String str=new String(a,1,2); // 字符串str的內(nèi)容是“av” 4.public String(String value) 采用value對(duì)象的值構(gòu)造一個(gè)新的string對(duì)象。 例如: String str1=“Java”; String str2=new String(“Java”); System.out.println(str2); System.out.println(str1==str2); 5.public String(StringBuffer Buffer)注意采用字符串常量初始化一個(gè)String引用的問題。例如: String str = “abc”;相當(dāng)于: char data[ ] = {'a', 'b', 'c'};String str = new String(data);應(yīng)用舉例,注意程序6-2的輸出結(jié)果: public class TestString{ // 程序6-2 public static void main(String args[ ]){ String s1=“Java”, s2=“Java”; String s3=new String(s1); System.out.println(“ s1==s2 is ”+(s1==s2)); / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) System.out.println(“ s1==s3 is ”+(s1==s3)); s1=“ABC”; s2=“DEFG”; System.out.println(“ s1==s2 is ”+(s1==s2)); s1=s2; System.out.println(“ s1==s2 is ”+(s1==s2));} } 6.2.3 String類常用方法 1.public int length(): 求串長(zhǎng)。例如: String str=“Java” ; System.out.println(str.length());2.public char charAt(int index) 提取指定位置上的字符。 3.public int compareTo(String anotherString) 對(duì)字符串內(nèi)容按字典序進(jìn)行大小比較。例如: public class SortStringArrary{ // 程序6-3 public static void main(String args[ ]){ String str,s[ ]={“Computer”,“CHINA”,“world”,“U.S.A”};int i,j,k; System.out.print(“排序之前:”);for(i=0;i System.out.print(“t”+s[i]);for(i=0;i for(k=i,j=i+1;j if(s[k].compareTo(s[j])>0) k=j; str=s[i]; s[i]=s[k]; s[k]=str;// 注意該行的含義 } System.out.print(“n排序之后:”);for(i=0;i System.out.print(“t”+s[i]); } } 4.char[ ] toCharArray() 將String對(duì)象轉(zhuǎn)換到一個(gè)字符數(shù)組中,例如: String s=“Hello,Java!”; char a[ ]; a=s.toCharArray(); for(int i=6;i System.out.print(a[i]);5.public boolean equals(String anString) 比較兩個(gè)字符串對(duì)象的內(nèi)容是否相等。 / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) 6.public boolean equalsIgnoreCase(String anotherString) 以忽略大小寫方式,比較兩個(gè)字符串對(duì)象的內(nèi)容是否相等。 注意:equals()方法與“==” 之間的區(qū)別。例如: public class ConfuseQuestion{ // 程序6-5 public static void main(String args[ ]){ String s1=“java”; String s2=new String(s1); String s3=s2; System.out.println(s1.equals(s2)); System.out.println(s2.equals(s3)); System.out.println(s2==s3); System.out.println(s2.equals(s3));} } 7.public int indexOf(int ch / String str) 在字符串中搜索字符或子串,返回字符或子串在String對(duì)象中從左邊起首次出現(xiàn)的位置。如果沒有出現(xiàn),返回-1。 8.public String substring(int begin, int end) 提取string對(duì)象中從begin開始,到end-1結(jié)束的子串,返回提取的子串。 9.public String concat(String str)將str對(duì)象接到調(diào)用對(duì)象的后面,返回新串。例如: String s1=“Hello ” , s2=“Java” , s3; s3=s1.concat(s2); System.out.println(s3);注意:如果參數(shù)str為空(null),則concat方法不創(chuàng)建新串,而僅僅返回當(dāng)前串,10.public String replace(char oldChar, char newChar) 將String對(duì)象中所有的oldChar字符替換為newChar,返回替換后的新串。例如: String path=“d:/myjava/documents”; System.out.println(path.replace('/' , '')); public String toString() 返回當(dāng)前字符串對(duì)象本身。 12.public static String valueOf(各種類型 f) 將各種數(shù)據(jù)類型轉(zhuǎn)換成一個(gè)相應(yīng)的字符串表示,該方法是一個(gè)static方法。 程序6-6演示了valueOf()方法的應(yīng)用。 程序6-7自學(xué)。 public class TestValueOf{ // 程序6-6 public static void main(String args[ ]){ char a[ ]={'A','B','C','D','E','F'}; int i=123456; float f=3.14159f; boolean b=true; Object o=null; / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) System.out.println(String.valueOf(a)); System.out.println(String.valueOf(a,2,3)); System.out.println(String.valueOf(i)); System.out.println(String.valueOf(f)); System.out.println(String.valueOf(b)); System.out.println(String.valueOf(o));} } 6.2.4 Java應(yīng)用程序的命令行參數(shù) 應(yīng)用程序可以通過main方法的String數(shù)組,訪問由解釋器傳遞的命令行參數(shù)。例如: public class ShowMainArguments{ //程序6-8 public static void main(String args[ ]){ for(int i = 0;i < args.length;i++) System.out.println(args[ i ]); } } 6.3 StringBuffer類 StringBuffer類對(duì)象是一個(gè)內(nèi)容可以改變的字符串??梢詼p少由于少量字符的插人而引起的空間分配問題。 StringBuffer類的原型: public final class java.lang.StringBuffer extends java.lang.Object { … } StringBuffer類對(duì)象有一塊緩沖區(qū),字符串被存放在緩沖區(qū)中,緩沖區(qū)的大小可以隨程序的需要進(jìn)行調(diào)整。緩沖區(qū)的大小稱為對(duì)象的容量。 當(dāng)修改對(duì)象的內(nèi)容時(shí),只要StringBuffer對(duì)象包含的字符個(gè)數(shù)沒有超出容量,就不會(huì)分配新的空間,而直接在原空間內(nèi)進(jìn)行修改。若字符的個(gè)數(shù)超出了容量,該對(duì)象會(huì)自動(dòng)調(diào)整其容量,從而適應(yīng)新的存儲(chǔ)。 6.3.1 創(chuàng)建StringBuffer類對(duì)象 StringBuffer類的構(gòu)造函數(shù)有三種方式: 1.public StringBuffer()創(chuàng)建一個(gè)內(nèi)容為空的StringBuffer對(duì)象,容量為16。 例如:StringBuffer s=new StringBuffer();2.public StringBuffer(int length)初始內(nèi)容為空,容量為length指定的大小。注意:length應(yīng)大于等于0,不能為負(fù)數(shù),否則會(huì)產(chǎn)生異常。例如: StringBuffer s2=new StringBuffer(2);3.public StringBuffer(String str) 初始內(nèi)容和參數(shù)str的內(nèi)容相同,容量為參數(shù)str的長(zhǎng)度加上16。例如: String s1=“Java”; StringBuffer s2=new StringBuffer(s1);則s2的容量是20,內(nèi)容是“Java”。 / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) 6.3.2 StringBuffer類常用方法 1.public int length() 返回字符串的長(zhǎng)度 2.public int capacity() 返回緩沖區(qū)大小 3.public void setLength(int newLength) 指定對(duì)象的長(zhǎng)度,將對(duì)象的內(nèi)容進(jìn)行裁減。如果參數(shù)小于對(duì)象的長(zhǎng)度,則將對(duì)象截?cái)?;如果參?shù)大于等于對(duì)象的長(zhǎng)度,則填充空字符('u0')擴(kuò)充新增加的部分。4.public void ensureCapacity(int NewCapacity) 設(shè)定對(duì)象的緩沖區(qū)的大小,若參數(shù) 小于對(duì)象的容量,則新的設(shè)置將不起作用,也就是說容量只能擴(kuò)大而不能縮小。 程序6-9演示了這幾個(gè)方法的具體應(yīng)用。 public class TestCapacity{ // 程序6-9 public static void main(String args[ ]){ String s=“Java”;StringBuffer str=new StringBuffer(s); System.out.println(“Length=”+str.length());System.out.println(“Capacity=”+str.capacity());str.setLength(8); // 設(shè)置長(zhǎng)度為8 str.ensureCapacity(80);// 設(shè)置容量為80 System.out.println(“nstr= ”+str);System.out.println(“Length = ”+str.length());System.out.println(“capacity = ”+str.capacity()); str.setLength(3); str.ensureCapacity(20);System.out.println(“nstr= ”+str);System.out.println(“Length = ”+str.length());System.out.println(“capacity = ”+str.capacity()); } } 5.public void setCharAt(int index, char ch) 將參數(shù)index指定位置上的字符,設(shè)置成參數(shù)ch 指定的字符。例如: StringBuffer str=new StringBuffer(“Hello,Java”); str.setCharAt(3,'L'); 則str的內(nèi)容變成了“HelLo,Java” 6.public StringBuffer append(多種數(shù)據(jù)類型) 將其它類型的數(shù)據(jù)添加到StringBuffer對(duì)象的尾部,返回修改后的StringBuffer對(duì)象。 例如:StringBuffer s1,s2=new StringBuffer(); s1=s2; // s1和s2代表同一個(gè)對(duì)象 s2.append(3.14).append(' ').append(“Java”); / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) System.out.println(s1==s2); // 輸出true System.out.println(s1); // 輸出3.14 Java 7.public String toString() 該方法把StringBuffer對(duì)象的內(nèi)容復(fù)制到一個(gè)新的String類對(duì)象中,返回這個(gè)新的String類對(duì)象。例如程序6-10。 public class BufferToString{ // 程序6-10 public static void main(String args[ ]){ String s1;StringBuffer s2=new StringBuffer(“Hello ”); s1=s2.append(“Java!”).toString();System.out.println(“s1=”+s1+“"+”s2=“+s2); } } 8.public StringBuffer insert(int offset, 多種類型 b)該方法是將一個(gè)其它類型的對(duì)象b插入到offset指定的位置。例如: StringBuffer str=new StringBuffer(” Java!“); // 將字符串”Hello“插入到下標(biāo)為0的位置 str.insert(0,”Hello“); System.out.println(”str= “+str);輸出結(jié)果為: str= Hello Java! 6.4 應(yīng)用舉例 略 課堂練習(xí): 無 課外練習(xí)(作業(yè)): P119 2、3、4 第7章 異常處理 教學(xué)目的要求 了解異常的層次結(jié)構(gòu); 掌握異常處理語句; 了解自定義異常; 了解異常處理中常用的調(diào)試方法。 主要內(nèi)容 ? 異常的層次結(jié)構(gòu); ? 異常處理語句; ? 自定義異常; ? 異常處理中常用的調(diào)試方法。 / 87 ? ? ? ? 大理學(xué)院課程教案(教學(xué)內(nèi)容) 重點(diǎn)內(nèi)容 ? 異常處理語句; 難點(diǎn)內(nèi)容 無 課時(shí)分配 1課時(shí) 教學(xué)方法 講授法、演示法、對(duì)比法、實(shí)驗(yàn)驗(yàn)證法 講授內(nèi)容提要 7.1 異常的層次結(jié)構(gòu) Throwable是異常類的根節(jié)點(diǎn),定義在java.lang包,它的子類也定義在該包中; Error代表系統(tǒng)錯(cuò)誤類,由系統(tǒng)直接處理; Exception類及其子類是在程序中可捕捉到的異常。見圖7.1 Throwable Error … AWTError LinkageError VirtualMachineError RuntimeException ArithmeticException ArrayIndexOutOfBoundsException … Interrupted Exception FileNotFoundException… EOFException AWTException IOException Exception 1.java.lang.ArithmeticException 0作除數(shù)(包括模),將產(chǎn)生這類異常。例如:int x=0 , y; y=100/x; 2.java.lang.ArrayIndexOutOfBoundsException 例如:int a[ ]=new int[10]; a[10]=0; 3.java.lang.ArrayStoreException 例如:int a[ ]=new int[10]; boolean b[ ]=new boolean[10]; System.arraycopy(a,0,b,3,6);//有異常 4.java.lang.ClassCastException 例如: Object obj=new Object(); int a[ ]=(int[ ])(obj); 5.java.lang.IndexOutOfBoundsException 例如:char ch=”ABC“.charAt(99); / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) 注意: 2 是5的子類。 6.java.lang.NegativeArraySizeException 例如: int a[ ]=new int[-10]; 7.java.lang.NullPointerException 例如:int a[ ]=null; System.out.print(a.length);7.2 異常處理語句 缺省的異常處理的情況,例如: public class DefaultException{ // 程序7-1 public static void main(String args[ ]){ int a,b=0; a=2/b; // 此處有異常 System.out.println(“a=”+a);// 不運(yùn)行此行 } } 異常處理語句有try、catch、finally、throw和throws。異常處理的形式為: try{ 程序執(zhí)行體 }catch(異常類型1 異常對(duì)象1){ 異常處理程序體1 }catch(異常類型2 異常對(duì)象2){ 異常處理程序體2 }finally { 異常處理結(jié)束前的執(zhí)行程序體 } 7.2.1 try和catch語句 try語句指明可能產(chǎn)生異常的代碼段;catch語句在try語句之后,用于捕捉異常,一個(gè)try語句可以有多個(gè)catch語句與之匹配。異常處理以后,程序從try語句代碼段后繼續(xù)執(zhí)行。例如:程序7-2。public class TryCatchTest{ // 程序7-2 public static void main(String args[ ]){ int a=99,b=0,c; try{ System.out.println(”產(chǎn)生異常之前“); c=a/b; // 該行有異常 System.out.println(”產(chǎn)生異常之后“);}catch(ArrayIndexOutOfBoundsException e){ System.out.println(”處理下標(biāo)越界異常“);}catch(ArithmeticException e){ System.out.println(”處理算術(shù)異?!?;} System.out.println(”異常處理結(jié)束“); / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) } } 注意:用catch語句捕捉異常時(shí),若找不到相匹配的catch語句,將執(zhí)行缺省的異常處理。例如: int a=99,b=0,c; try{ c=a/b;//產(chǎn)生的異常和捕捉的異常類型不一致 }catch(ArrayIndexOutOfBoundsException e){ System.out.println(”處理異?!?; } 注意:當(dāng)有多個(gè)catch語句時(shí),系統(tǒng)依照先后順序逐個(gè)檢查。例如: try{ c=a/b; }catch(ArithmeticException e){ System.out.println(”Divided by zero“);}catch(RuntimeException e){ System.out.println(”Divided by zero“);} 7.2.2 finally語句 無論是否產(chǎn)生異常,finally語句指明的代碼一定被執(zhí)行。例如: public class testFinally{ // 程序7-3 public static void main(String args[ ]){ int a,b=0; for(int i=0;i<=3;i++){ System.out.println(”Test No: “+(i+1));try{ switch(i){ case 0: a=3/b; break; case 1: int c[ ]=new int[10]; c[10]=0; break; case 2: char ch=”ABC“.charAt(99); break; case 3: return; } }catch(ArithmeticException e){ System.out.println(“零作除數(shù)!”); }catch(ArrayIndexOutOfBoundsException e){ System.out.println(”數(shù)組下標(biāo)越界!“);}catch(IndexOutOfBoundsException e){ System.out.println(”下標(biāo)越界!“);}finally{ / 87 大理學(xué)院課程教案(教學(xué)內(nèi)容) System.out.println(”在finally塊中!“);} } } } 7.2.3 throw語句 throw語句用于指出當(dāng)前行有異常,當(dāng)程序執(zhí)行到throw語句時(shí),流程就轉(zhuǎn)到相匹配的異常處理語句,所在的方法也不再返回值。 throw語句可以將異常對(duì)象提交給調(diào)用者,以進(jìn)行再次處理。例如:程序7-4。public class ThrowException{ // 程序7-4 public static void Test(){ try{ int c[ ]=new int[10]; c[10]=0;}catch(ArrayIndexOutOfBoundsException e){ System.out.println(”t 數(shù)組下標(biāo)越界!“); throw e; // 異常拋出點(diǎn) //System.out.println(“t產(chǎn)生異常后!”); 該行無法通過編譯 } } public static void main(String args[ ]){ try{ Test();}catch(IndexOutOfBoundsException e){ System.out.println(”t 下標(biāo)越界!“);}finally{ System.out.println(”t 在finally塊中!“); } } } 7.2.4 throws語句 throws語句指明方法中可能要產(chǎn)生的異常類型,由調(diào)用者進(jìn)行異常處理。例如: import java.io.*; // 程序7-6 public class testThrows { public static String readString()throws IOException{ int ch; String r=”"; boolean done=false; while(!done){ ch=System.in.read(); if(ch<0 || ch==0xd) done=true; / 87 《Java程序設(shè)計(jì)》 授 課 人:授課班級(jí):電子商務(wù)專業(yè) 授 課 教 案 第一章 Java語言簡(jiǎn)介 教學(xué)目的要求 ? 了解Java的基本特點(diǎn)和用途 ? 掌握如何下載Java SDK軟件包 ? 了解設(shè)置Java程序的開發(fā)環(huán)境SDK ? 如何運(yùn)行Java程序 ? 了解Java的概貌 主要內(nèi)容 ? Java語言的發(fā)展歷程; ? Java語言的特點(diǎn); ? ? ? ? Java語言的開發(fā)工具; Java應(yīng)用程序和小程序; Java程序的注釋方法; 寫Java程序的風(fēng)格規(guī)范。 重點(diǎn)內(nèi)容 ? Java語言的特點(diǎn); ? Java語言的開發(fā)工具; ? Java應(yīng)用程序和小程序; 難點(diǎn)內(nèi)容 無 課時(shí)分配 1課時(shí) 教學(xué)方法 講授法、演示法、對(duì)比法 講授內(nèi)容提要 1.1 Java語言的發(fā)展簡(jiǎn)介 1991年Sun Mircosystem 公司成立了一個(gè)Green項(xiàng)目開發(fā)小組,Jame Gosling 為組長(zhǎng); 設(shè)計(jì)Java 采用虛擬機(jī)代碼(Virtual Machine Code),即.class文件,它通過解釋器運(yùn)行 ; 1995年5月Sun Mircosystem 公司對(duì)外正式發(fā)布Java1.0; Java2 用途:適用于各種應(yīng)用開發(fā),尤其是網(wǎng)絡(luò)應(yīng)用,網(wǎng)絡(luò)服務(wù)和嵌入式系統(tǒng)。1.2 Java語言的特點(diǎn) 1.簡(jiǎn)單性 2.面向?qū)ο?3.網(wǎng)絡(luò)適用性 4.健壯性 5.安全性 6.平臺(tái)無關(guān)性 7.可移植性 8.解釋型 9.高性能 10.多線程 11.動(dòng)態(tài)性 12.豐富的類庫 13.嵌入瀏覽器運(yùn)行 1.3 Java類庫的概念 1.4 網(wǎng)絡(luò)瀏覽器 1.5 Java開發(fā)工具 NetBeans: 這個(gè)集成環(huán)境可以方便地進(jìn)行程序的編輯、編譯、生成和運(yùn)行。J2sdk : http:// java.sun.com免費(fèi)下載;Visual J++ 6.0 / 8.0: VJ++還吸收了VB集成開發(fā)環(huán)境IDE的特征,是一個(gè)強(qiáng)有力的Java程序開發(fā)工具。Jcreator Eclipse(MyEclipse)等 1.6 Java程序的分類 基于控制臺(tái)的應(yīng)用程序; 基于瀏覽器運(yùn)行的小程序applet。 小程序與應(yīng)用程序的區(qū)別是:小程序必須依賴一個(gè)HTML文件和支持Java的網(wǎng)絡(luò)瀏覽器。老師演示小程序和applet程序 應(yīng)用程序舉例(程序1-1): public class hello { public static void main(String args[ ]){ System.out.println(“Hello Java!”); } } 小程序舉例(程序1-2): import java.awt.Graphics; // 注意該行的含義 import java.applet.Applet;public class sayhello extends Applet { public void paint(Graphics g){ g.drawString(“Hello Java!”,35,30); } } 小程序?qū)?yīng)的HTML文件: 1.7 1.8 對(duì)Java程序的解釋 編寫Java程序的風(fēng)格要求 課堂練習(xí): 請(qǐng)編寫一個(gè)應(yīng)用程序輸出你自己的學(xué)號(hào)和姓名 課外練習(xí)(作業(yè)): 下載并安裝J2SDK; 設(shè)置系統(tǒng)環(huán)境變量 下載并安裝MyEclipse 熟悉MyEclipse的開發(fā)環(huán)境 第2章 數(shù)據(jù)類型、運(yùn)算符和表達(dá)式 教學(xué)目的要求 ? 掌握字符常量和符號(hào)表示的常量的概念和應(yīng)用 ? ? ? ? 掌握整形、浮點(diǎn)型、字符型和布爾型變量的概念和應(yīng)用 掌握數(shù)據(jù)的概念 理解參數(shù)傳遞方式 學(xué)會(huì)邏輯運(yùn)算符、算術(shù)運(yùn)算符和位運(yùn)算符的使用方法 主要內(nèi)容 ? 常量:包括字面常量和符號(hào)表示的常量; ? 變量:整形、浮點(diǎn)型、字符型和布爾型; ? 數(shù)組:Java的數(shù)組屬于類類型; ? 參數(shù)傳遞方式; ? 運(yùn)算符:包括邏輯運(yùn)算符、算術(shù)運(yùn)算符和位運(yùn)算符等; 重點(diǎn)內(nèi)容 ? 整形、浮點(diǎn)型、字符型和布爾型變量的概念和應(yīng)用; ? 符常量和符號(hào)表示的常量的概念和應(yīng)用 難點(diǎn)內(nèi)容 ? 參數(shù)傳遞方式 課時(shí)分配 2課時(shí) 教學(xué)方法 講授法、演示法、對(duì)比法、實(shí)驗(yàn)驗(yàn)證法 講授內(nèi)容提要 2.1 常量 整形常量:采用八進(jìn)制、十進(jìn)制、十六進(jìn)制表示,但不能采用二進(jìn)制表示,和C/C++中的一樣。 浮點(diǎn)常量:采用十進(jìn)制或科學(xué)記數(shù)法表示。在缺省情況下一個(gè)浮點(diǎn)數(shù)是double型。布爾常量:true和false,它們不是數(shù),不能進(jìn)行算術(shù)運(yùn)算。字符常量:與C/C++中的表示類似 。字符串常量:Java中字符串常量是對(duì)象。 2.2 變量 變量的命名原則是:以字母(’a’?’z’和 ’A’?’Z’)、下劃線(‘_’)和‘$’符號(hào)開頭的,由字母、數(shù)字(’0’?’9’)、下劃線和‘$’構(gòu)成的一個(gè)符號(hào)序列。 例如,a,_a,NameOfStudent,$10均是合法變量名,而-a和9a是非法變量名。關(guān)鍵字不能用作變量名(見表2-1)注意:Java對(duì)變量是區(qū)分大小寫.2.2.1 整形類型的變量 字節(jié)(byte)型,8個(gè)位。 短整形(short),占16個(gè)位。整形(int),占32個(gè)位。 長(zhǎng)整形(long int),占64個(gè)位。 Java中的整形最值均有符號(hào)。例如程序2-1測(cè)試最值: public class Test_Int { // 程序2-1 測(cè)試整形變量的最值 public static void main(String [ ] args){ System.out.println(Byte.MAX_VALUE); System.out.println(Byte.MIN_VALUE); System.out.println(Short.MAX_VALUE);System.out.println(Short.MIN_VALUE); System.out.println(Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE); System.out.println(Long.MAX_VALUE); System.out.println(Long.MIN_VALUE); } } 注意: byte、short、int、long是原子類型,而Byte、Short、Integer和Long分別是四種原子類型對(duì)應(yīng)的類類型。 2.2.2 字符類型變量 Java字符量的長(zhǎng)度為16個(gè)位,表示范圍是從‘u0000’ 到 ‘uffff’ 即從0 到 65535; Character是char類型對(duì)應(yīng)的類類型 ; 最大值 Character.MAX_VALUE ; 最小值 Character.MIN_VALUE ; 2.2.3 浮點(diǎn)類型變量 分類:float和double。 Float、Double 是對(duì)應(yīng)的類類型 ; Float.MAX_VALUE、Float.MIN_VALUE是最值。Float.POSITIVE_INFINITY 和 Float.NEGATIVE_INFINITY是正/負(fù)無限大。2.2.4 布爾類型變量 boolean變量取值:true和false ; true和false不能轉(zhuǎn)換成任何數(shù)值表示,true不是1,false也不是0。 2.2.5 原子類型變量的生存空間 一個(gè)變量的生存空間是由兩個(gè)大括號(hào)決定的 范圍。下列寫法在C/C++中是正確的,但在Java中是錯(cuò)誤的(注意)。{ int x=1;{ int x=0;// 錯(cuò)誤 } } 2.3 變量賦值問題 如果類中定義的原子類型變量,未給出初值,那么它們將有缺省值 :byte、short、int 和long變量的缺省值是0;char、float、double和boolean變量的缺省值分別是’u0’、0.0f、0.0d和false。 方法內(nèi)定義的局部變量,應(yīng)當(dāng)對(duì)其賦值,否則無法通過編譯。例如: // 程序2-4 class Test { // 定義一個(gè)類 int Value;// 類中的變量未賦值,缺省就是0 } public class Test_Var{ public static void main(String [ ] args){ int x=100; // 必須賦值,否則無法通過編譯 Test obj=new Test();// 對(duì)象賦值 System.out.println(obj.Value +“ ”+x); } } 2.4 數(shù)組 Java數(shù)組是系統(tǒng)定義類Array 的子類; 數(shù)組的分類同C/C++:一維和多維。 2.4.1 一維數(shù)組 定義數(shù)組的格式 :int a[ ] ; 或 int[ ] a ;其值是null ; 在定義數(shù)組時(shí)不能指定大小。a僅是一個(gè)引用,代表一個(gè)數(shù)組名,但沒有對(duì)應(yīng)的空間。產(chǎn)生數(shù)組空間的方法有兩種 : 在定義時(shí)直接賦值:int a[ ]={1,2,3}; 通過new分配空間: int a[ ]=new int[10];public class Test_Array{ public static void main(String [ ] args){ int a[ ]={1,2,3}, b[ ]; b= a; for(int i=0;i<3;i++)b[ i ]++; for(int i=0;i<3;i++)System.out.println(a[i]); } } public class Test_Array{ public static void main(String [ ] args){ int a[ ]={1,2,3}, b[ ]; b = new int[6]; System.out.println(“b數(shù)組長(zhǎng)度 = ” + b.length); for(int i=0;i System.out.print(b[i]+“ ”); } } 注意:(1)獲得數(shù)組元素的個(gè)數(shù):數(shù)組名.length; (2)一個(gè)整形數(shù)組若僅僅采用new分配空間,而沒有對(duì)其賦值,那么每個(gè)元素的值是0 注意:Java數(shù)組名是一個(gè)引用,當(dāng)將一個(gè)數(shù)組名賦值給另一個(gè)數(shù)組時(shí),實(shí)際上是名字的復(fù)制 2.5 Java中的參數(shù)傳遞方式 Java的參數(shù)傳遞的形式有兩種:基本類型按值傳遞,對(duì)象類型按引用傳遞; 通過return語句從方法中返回時(shí),基本類型總是以值的方式返回,而對(duì)象總是以引用方式返回。例如程序2-8 : class test{ int x;} public class Test_Paras { static test fun(test o,int y){ o.x=20; } } y=1; return o;public static void main(String [ ] args){ test obj1 , obj2;int Val = 3;obj1=new test();obj1.x=100; obj2=fun(obj1,Val); System.out.println(obj1.x+“ ”+ obj2.x+“ ”+Val); } 2.6 Java的運(yùn)算符 主要包括: 算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符和三元條件運(yùn)算符。2.6.1 算術(shù)運(yùn)算符 算術(shù)運(yùn)算符:+、-、*、/、%、++和--,與C/C++基本相同。 %運(yùn)算符不但可以對(duì)整形數(shù)據(jù)運(yùn)算,而且可以對(duì)浮點(diǎn)型數(shù)據(jù)運(yùn)算。例如:3.14 % 2.5的值約等于0.64 ; 隠式數(shù)據(jù)類型轉(zhuǎn)換: 當(dāng)整型與浮點(diǎn)型數(shù)據(jù)進(jìn)行混合運(yùn)算時(shí),表達(dá)式中的數(shù)據(jù)類型會(huì)進(jìn)行相應(yīng)的自動(dòng)轉(zhuǎn)換,規(guī)則為:byte->short->int->long->float->double。 這種轉(zhuǎn)換規(guī)則也適應(yīng)于賦值語句,當(dāng)賦值符左右兩側(cè)變量類型不一致時(shí),只要轉(zhuǎn)換過程中不丟失數(shù)據(jù),便進(jìn)行自動(dòng)轉(zhuǎn)換。 class number { int x;} public class relationalOperator{ public static void main(String args[ ]){ } number n1,n2; n1=new number(); n2=new number();n1.x=1; n2.x=1;if(n1.x==n2.x) System.out.println(“對(duì)象的數(shù)據(jù)成員x相等!”); if(n1==n2) System.out.println(“n1和n2是一個(gè)對(duì)象!”);else System.out.println(“n1和n2不是一個(gè)對(duì)象!”);} 2.6.2 關(guān)系運(yùn)算符 關(guān)系運(yùn)算符不能同其它類型的變量一同 參與運(yùn)算,例如假設(shè)a,b,c是三個(gè)整形的變量,那么 a=b==c 是 正確 OR 錯(cuò)誤? ; 關(guān)系運(yùn)算符用于對(duì)象時(shí),是判別兩個(gè)引用是否代表同一個(gè)對(duì)象。而不是判斷兩個(gè)引用所指向的對(duì)象是否同屬一個(gè)類。 2.6.3 邏輯運(yùn)算符 邏輯運(yùn)算符有&&、|| 和!,分別是與、或和非。運(yùn)算結(jié)果是true或false; 邏輯運(yùn)算有求值“短路”現(xiàn)象,例如程序2-11 : public class shortCut { static boolean testOne(int x){ System.out.println(x+“ < ”+1+“ ” +(x<1));return x < 1;} static boolean testTwo(int x){ System.out.println(x+“ < ”+1+“ ” +(x<2));return x < 2; } public static void main(String [ ] args){ } if(testOne(6)&& testTwo(1))System.out.println(“表達(dá)式為真”);else System.out.println(“表達(dá)式為假”); } 2.6.4 位運(yùn)算符 位運(yùn)算符:&、|、^、~、<<、>>,分別稱為位與、或、異或、左移、右移; Java引入一個(gè)專門用于邏輯右移運(yùn)算符>>>,它采用了所謂的零擴(kuò)展技術(shù),不論原值是正或負(fù),一律在高位補(bǔ)0。例如: int a=-2 , b; b=a>>>30;2.6.5 三元條件運(yùn)算符 語法格式:(exp)?(exp1):(exp2); Java要求:(exp1)與(exp2)必須同類型。2.6.6 “+”運(yùn)算符 Java對(duì)“+”進(jìn)行了重載,可以將任何類型的對(duì)象(包含原子類型)轉(zhuǎn)化為String類型。例如: int x=1;char ch='A';double d=9.8;System.out.println(“Result: ”+x+ch+9.8);課堂練習(xí): 課外練習(xí)(作業(yè)): P32 3、4、6題。 第3章 控制語句 教學(xué)目的要求 ? 了解Java程序的結(jié)構(gòu),學(xué)習(xí)使用各種語句結(jié)構(gòu)來控制程序的流程,完成程序的功能任務(wù)。 主要內(nèi)容 ? Java的分支語句; ? 循環(huán)控制語句; ? break和continue語句; ? 帶標(biāo)號(hào)的break和continue語句。 重點(diǎn)內(nèi)容 ? Java的分支語句; ? 循環(huán)控制語句; ? break和continue語句; 難點(diǎn)內(nèi)容 ? 循環(huán)控制語句; ? break和continue語句; 課時(shí)分配 3課時(shí) 教學(xué)方法 講授法、演示法、對(duì)比法、實(shí)驗(yàn)驗(yàn)證法 講授內(nèi)容提要 3.1 分支語句 if-else語句; switch-case語句。 3.1.1 if 語句 if語句的語法格式 同C/C++; 條件表達(dá)式必須是布爾類型,例如: 下面的寫法在C/C++中是合法的,但在Java中卻是非法的 : int i=10;if(i) ...程序3-1描述了用applet從文本框獲取數(shù)據(jù),然后將比較的結(jié)果顯示出來。 // 程序 3-1 import java.awt.*;import java.applet.*; public class compareNumbers extends Applet{ Label lab1,lab2;TextField input1,input2; int num1,num2;public void init(){ lab1=new Label(“輸入第1個(gè)整數(shù)”); input1=new TextField(10); lab2=new Label(“輸入第2個(gè)整數(shù)”);input2=new TextField(10); add(lab1); add(input1);add(lab2);add(input2);} public boolean action(Event e , Object o){ } if(e.target==input1 || e.target==input2){ num1=Integer.parseInt(input1.getText()); num2=Integer.parseInt(input2.getText()); if(num1 switch 語句 switch語句的語法結(jié)構(gòu) 同C/C++; switch后面的表達(dá)式類型必須是字符類型或整形 ; case后面的常量不能重復(fù) ; 程序3-3采用小程序?qū)崿F(xiàn)將學(xué)生的百分制成績(jī)轉(zhuǎn)換為優(yōu)、良,中、及格和不通過五個(gè)等級(jí): // 程序3-3 import java.awt.*;import java.applet.*; public class scoreConvert extends Applet{ Label prompt; TextField input;int Excellent,Good,Middle,Pass,Failure;public void init(){ prompt=new Label(“輸入成績(jī)”); } public void paint(Graphics g){ g.drawString(“各等級(jí)的人數(shù):”,25,40);g.drawString(“優(yōu)秀 : ”+Excellent,25,55);g.drawString(“良好 : ”+Good,25,70);g.drawString(“中等 : ”+Middle,25,85);g.drawString(“及格 : ”+Pass,25,100);g.drawString(“不通過: ”+Failure,25,115);input=new TextField(2);add(prompt);add(input);} public boolean action(Event e , Object o){ int score=Integer.parseInt(input.getText()); showStatus(“"); input.setText(”“); switch(score/10){ case 10: case 9: Excellent++; break;case 8: Good++; break;case 7: Middle++; break;case 6: Pass++; break;case 5: case 4: case 3: case 2: case 1: case 0: Failure++; break;default: showStatus(”輸入有誤,重新輸入!“); } repaint(); return true;} } 程序3-3需要注意的地方 在action()方法中調(diào)用的repaint()方法,是一個(gè)系統(tǒng)方法,它具有自動(dòng)調(diào)用paint()方法的能力,從而實(shí)現(xiàn)對(duì)網(wǎng)頁的刷新。3.2 循環(huán)控制語句 Java中的循環(huán)控制語句有三種,分別是:while,do-while和for語句;循環(huán)體內(nèi)的語句會(huì)反復(fù)執(zhí)行,直到控制布爾表達(dá)式的值變?yōu)閒alse為止。3.2.1 while語句 while語句格式: while(Boolean-Expression) StatementS 程序示例3-4 略 3.2.2 do-while語句 do-while語句的語法格式如下: do{ Statement }while(Boolean-Expression); 程序3-5 如下: // 產(chǎn)生一個(gè)大于0.9的隨機(jī)數(shù)為止 public class GenerateDoubleNumbers { public static void main(String args[ ]){ } double d;do{ d=Math.random();System.out.println(d); }while(d<0.9);} 3.2.3 for語句 for語句語法格式如下: for(ForInitopt;Boolean-Expression;ForUpdateopt) Statement // 程序3-6輸出一個(gè)*三角形 public class printGraphics extends Applet{ public void paint(Graphics g){ int xpos,ypos=0; for(int row=6;row>=1;row--){ xpos=25;ypos+=15; } for(int column=1;column<=row;column++){ } g.drawString(”*“,xpos,ypos);xpos+=7; } } 3.3 break語句和continue語句 3.3.1 不帶標(biāo)號(hào)的break語句和continue語句 break語句可以跳出包含它的最內(nèi)層的循環(huán),不再執(zhí)行剩余的語句; continue語句停止執(zhí)行當(dāng)前的循環(huán),回到循環(huán)處,開始執(zhí)行下一輪的循環(huán)。這些特性和C/C++的功能一樣。for(int i=1;i<10;i++) { if(i%3==0) continue; else System.out.println(”i = “+i); } for(int i=1;i<10;i++) { if(i%3==0) break; else System.out.println(”i = “+i); } 課堂練習(xí): 1、仔細(xì)分析下面程序,寫出程序的最終運(yùn)行結(jié)果。public class s_switch { public static void main(String args[]) { int ch=8; int r=10; switch(ch-1){ case 7: r=r+3; case 8: r=r+5; case 9: r=r+6;break; default:; } System.out.println(”r=“+r); } } 2、隨機(jī)產(chǎn)生26個(gè)英文字母a~z,直到大于u為止。用while和for語句實(shí)現(xiàn)。 課外練習(xí)(作業(yè)): P44 1—4 第4章 Java的類 教學(xué)目的要求 ? 理解面向?qū)ο缶幊痰幕靖拍?? 了解類的封裝方法 ? 如何創(chuàng)建類和對(duì)象 ? 了解成員變量和成員方法的特性 ? 學(xué)習(xí)使用OOP方式進(jìn)行程序設(shè)計(jì) ? 深刻理解類的繼承性和多態(tài)性 主要內(nèi)容 ? 類的定義和使用; ? 方法的定義和使用; ? 實(shí)例變量和局部變量; ? 構(gòu)造方法; ? ? ? ? 方法的覆蓋和重載; 關(guān)鍵字this的用法; 繼承的概念和應(yīng)用; 組合與繼承; ? 抽象方法和抽象類; ? 對(duì)象類型轉(zhuǎn)換; ? 訪問權(quán)限限制符:public、private、protected。 重點(diǎn)內(nèi)容 ? 類的定義和使用; ? 方法的定義和使用; ? 構(gòu)造方法; ? 方法的覆蓋和重載; ? 關(guān)鍵字this的用法; ? ? ? ? 繼承的概念和應(yīng)用; 組合與繼承; 抽象方法和抽象類; 對(duì)象類型轉(zhuǎn)換; 難點(diǎn)內(nèi)容 ? 構(gòu)造方法; ? 方法的覆蓋和重載; ? 繼承的概念和應(yīng)用; ? 組合與繼承; ? 抽象方法和抽象類 課時(shí)分配 8課時(shí) 教學(xué)方法 講授法、演示法、對(duì)比法、實(shí)驗(yàn)驗(yàn)證法、學(xué)生討論法 講授內(nèi)容提要 4.1 類與對(duì)象 在Java程序中,除原子類型的變量以外都是對(duì)象,連Java程序本身也不例外。 類是面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ),OO始終是圍繞著對(duì)象的封裝性、繼承性和多態(tài)性展開討論的。 4.1.1 類與對(duì)象的區(qū)別 類是一個(gè)抽象的概念,對(duì)象是一個(gè)具體的概念。 類是在一組對(duì)象的基礎(chǔ)上,通過抽象和概括獲得的一個(gè)概念。 對(duì)象是由數(shù)據(jù)和方法緊密結(jié)合的一個(gè)封裝體,具有信息隱藏的能力。 對(duì)象可以通過方法(函數(shù))與其它對(duì)象進(jìn)行通信,但并不知道這些方法的實(shí)現(xiàn)細(xì)節(jié)。4.1.2 Java和C編程思想的區(qū)別 C是結(jié)構(gòu)化的編程語言,以函數(shù)為編程單元,程序員把注意力集中在編寫函數(shù)上。Java是面向?qū)ο蟮木幊陶Z言,以類為編程單元,程序員的精力集中在對(duì)類的設(shè)計(jì)上。 對(duì)象將實(shí)例變量(instance variable)和對(duì)數(shù)據(jù)的操作(即方法)約束在一起,類似一個(gè)獨(dú)立的程序,易于擴(kuò)充,易于維護(hù),代碼可復(fù)用。 4.1.3 如何定義類 類是對(duì)象的模板,它定義了對(duì)象的結(jié)構(gòu)和操作數(shù)據(jù)的方法。public class Sayhello extends Applet { public void paint(Graphics g){ int xPos=35; int yPos=30; g.drawString(”Hello Java!“,xPos,yPos); } } 定義類的通用格式如下: class className extends superClassName{ type instance-vairbale1;return-type methodName1(parameter-list){ method-body;} } public class Hello { public static void main(String args[ ]){ System.out.println(”Hello Java!“); } } 系統(tǒng)類Object是整個(gè)類層次結(jié)構(gòu)中的根。 如果我們要定義Object的子類,可以不指明extends Object,默認(rèn)情況下一個(gè)類就是Object類的子類。 類內(nèi)定義的變量稱為實(shí)例變量,函數(shù)稱為方法; Java將類的定義和類的實(shí)現(xiàn)放在一起,便于系統(tǒng)維護(hù)。例如: class point { // Object類的子類 int x , y; void init(int a, int b){ int i=0; x=a; y=b; } } 4.1.4 對(duì)象和引用 對(duì)象是客觀存在的變量,對(duì)象的引用就是對(duì)象的名字,例如:Point p1;創(chuàng)建對(duì)象:p1=new Point(); 一個(gè)對(duì)象可以有多個(gè)別名; p2=p1;將一個(gè)變量設(shè)置為null,表明該變量不代表任何對(duì)象 : p1 = null; 每個(gè)對(duì)象都有自己的變量,改變一個(gè)對(duì)象的實(shí)例變量并不影響到另外一個(gè)對(duì)象。例如: class Point { // 程序4-1 int x , y; void init(int a, int b){ x=a; y=b; } } public class TwoPoint{ public static void main(String [ ]args){ Point p1= new Point(), p2= new Point(); p1.x=10;p2.x=30;p1.y=20;p2.y=40;System.out.println(”x = “+ p1.x +” y= “+p1.y);System.out.println(”x = “+ p2.x +” y= “+p2.y); } } 4.2 方法 方法是一個(gè)功能模塊,類似C中的函數(shù); 方法和實(shí)例變量都必須定義在類內(nèi),方法是類的功能接口 ; 定義方法的原則:方法應(yīng)當(dāng)只執(zhí)行單一的任務(wù),并且方法名能有效地表達(dá)該任務(wù); 方法的返回值類型、方法名和參數(shù)表共同稱之為方法的特征。調(diào)用方法的格式:引用.方法名(參數(shù)表);例如: Point p1=new point(),p2=new point();Point p3=p2;p1.init(10,20);//僅對(duì)p1對(duì)象的x和y進(jìn)行賦值 p2.init(30,40);//僅對(duì)p2對(duì)象的x和y進(jìn)行賦值 對(duì)象是客觀存在的變量,對(duì)象的引用就是對(duì)象的名字,例如:point p1;創(chuàng)建對(duì)象:p1=new point(); 一個(gè)對(duì)象可以有多個(gè)別名; p2=p1;將一個(gè)變量設(shè)置為null,表明該變量不代表任何對(duì)象 : p1 = null; 每個(gè)對(duì)象都有自己的變量,改變一個(gè)對(duì)象的實(shí)例變量并不影響到另外一個(gè)對(duì)象。 4.3 實(shí)例變量和局部變量 class Loc { // 程序4-2 int x=1;// 實(shí)例變量 void printLocVar(){ int x=25;// 局部變量 } System.out.println(”n x is :“+x); ++x; System.out.println(” x is :“+x); void printInstanceVar(){ System.out.println(”n x is :“+x); x*=10; System.out.println(x is :”+x);} } public class TestInstanceVar { // 程序的主類 public static void main(String args[ ]){ System.out.println(“ x is :”+x); obj.printLocVar(); obj.printInstanceVar(); System.out.println(“ x is :”+x); loc obj=new Loc(); int x=5; // 局部變量 x } } 4.3 實(shí)例變量和局部變量 Java中的變量分為兩種:類內(nèi)定義的實(shí)例變量,方法中定義的局部變量。 在同一個(gè)作用域內(nèi),不允許定義兩個(gè)同名的局部變量。 局部變量可以掩蓋實(shí)例變量。 實(shí)例變量屬于對(duì)象,它描述了對(duì)象的屬性,隨著對(duì)象的存在而存在; 局部變量是隨著方法的調(diào)用而存在,一旦方法調(diào)用結(jié)束,局部變量也就消亡了。4.4 構(gòu)造方法 構(gòu)造方法的功能是在創(chuàng)建對(duì)象時(shí)初始化對(duì)象的實(shí)例變量; 討論:構(gòu)造方法的特點(diǎn): 無返回值,無void 方法名與類名相同 僅在創(chuàng)建對(duì)象時(shí)調(diào)用 class point { // 程序4-3 } public class createPoint { public static void main(String args[ ]){ point p= new point(10,20); System.out.println(p.x +“ ”+p.y);} int x, y;point(int a, int b){ } x=a;y=b; } 如果類中沒有定義構(gòu)造方法,編譯器會(huì)自動(dòng)創(chuàng)建一個(gè)缺省的、不帶參數(shù)的構(gòu)造方法。構(gòu)造方法是在對(duì)象創(chuàng)建之后,new操作完成前被調(diào)用的。 4.5 方法重載 方法重載是在一個(gè)類中定義二個(gè)或多個(gè)同名的方法,但方法的參數(shù)個(gè)數(shù)或類型不完全相同;例如: class point { int x, y;point(int a, int b){ x=a;y=b;} point(){ x=-1;y=-1;} point(double a, int b){ x=(double)a;y=b;} } 方法重載的一個(gè)誤區(qū):是靠返回值區(qū)別重載,即定義多個(gè)方法,它們的名稱和形參類型完全相同,但返回值不同,這是不允許的; 4.6 關(guān)鍵字this this指代對(duì)象,是對(duì)當(dāng)前對(duì)象的一個(gè)引用。例如: class IntVector { // 程序4-6 int v[ ]; boolean equals(IntVector other){ if(this == other)return true; return false;} } class testIntVector { public static void main(String args[ ]){ IntVector t1=new IntVector(),t3=new IntVector(),t2=t1; System.out.println(t1.equals(t2)); System.out.println(t3.equals(t2)); } } Java中的級(jí)連調(diào)用,仍是指代當(dāng)前對(duì)象的this。例如:// 程序4-7 import java.awt.*;import java.applet.*; class time{ private int hour, min, sec; time(){ setHour(0);setMin(0); setSec(0);} time setHour(int h){ hour=((h>=0 && h<24)? h: 0);return this;} time setMin(int m){ min=((m>=0 && m<60)? m: 0); return this;} time setSec(int s){ sec=((s>=0 && s<60)? s: 0); return this;} String tostring(){ return hour+“:”+min+“:”+sec;} public class timeToString extends Applet{ private time t; public void init(){ } t=new time();} public void paint(Graphics g){ t.setHour(18).setMin(30).setSec(20); } g.drawString(“ time:”+t.tostring(),25,45);} 在構(gòu)造方法內(nèi)部使用this,它用于指代另外一個(gè)構(gòu)造方法,但不能指代非構(gòu)造方法。例如: class point { } 4.7 繼承 繼承是軟件重用的一種形式,可以提高系統(tǒng)的性能; 繼承語法: class className extends superClassName{ 各實(shí)例變量和方法的定義 } 例如: class point{ int x, y; point(int x, int y){ this.x=x;this.y=y;} point(){ this.x=0; this.y=0;} } class circle extends point{ int radius; circle(int r, int x, int y){ radius=r; this.x=x; this.y=y; } } Java不支持多繼承,但支持多接口; 子類的對(duì)象也是其超類的對(duì)象,反之未必; 繼承具有傳遞性: B繼承于A,C又繼承于B,則C也繼承了A中的實(shí)例變量和方法。 關(guān)鍵字super 構(gòu)造方法是一種特殊的方法,子類不能繼承超類的構(gòu)造方法,但子類構(gòu)造方法可以通過super調(diào)用超類的構(gòu)造方法。int x, y;point(){ this(-1,-1);} point(int a, int b){ x=a;y=b;} 當(dāng)創(chuàng)建子類對(duì)象時(shí),首先執(zhí)行超類構(gòu)造方法,然后執(zhí)行子類的構(gòu)造方法。例如: class point{ // 程序4-8 int x, y; point(int x, int y){ } } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r; System.out.println(“子類構(gòu)造函數(shù)被調(diào)用!”); this.x=x;this.y=y; System.out.println(“父類構(gòu)造函數(shù)被調(diào)用!”); } } public class testInherence { public static void main(String args[ ]){ circle c1; c1=new circle(1,1,1); } } 再次討論構(gòu)造方法 若父類沒有定義構(gòu)造方法,那么對(duì)父類數(shù)據(jù)的初始化將采用系統(tǒng)缺省的構(gòu)造方法;例如: class point{ int x, y; } class circle extends point{ int radius; circle(int r, int x, int y){ this.x=x; this.y=y; radius=r; } } 若父類定義有缺省構(gòu)造方法,那么子類可根據(jù)自己的需要設(shè)置自己的構(gòu)造方法。例如: class point{ int x, y; point(){ this(0,0); } point(int x, int y){ this.x=x;this.y=y; } } class circle extends point{ // 注意子類的構(gòu)造函數(shù) int radius; circle(int r, int x, int y){ radius=r;} } 若父類定義的構(gòu)造方法都是有參的,那么子類構(gòu)造方法必須通過super調(diào)用父類構(gòu)造方法,class point{ private int x, y; point(int x, int y){ this.x=x; this.y=y; } } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r; } } 4.8 方法的覆蓋 方法的覆蓋發(fā)生在父類和子類之間,若子類中定義的某個(gè)方法的特征,與父類中定義的某個(gè)方法的特征完全一樣,那么就說子類中的這個(gè)方法覆蓋了父類對(duì)應(yīng)的那個(gè)方法。 4.8.1 覆蓋與重載的區(qū)別 重載可以出現(xiàn)在一個(gè)類中,也可以出現(xiàn)在父類與子類的繼承關(guān)系中,并且重載方法的特征一定不完全相同。 覆蓋特點(diǎn):子類中的方法特征與父類定義的對(duì)應(yīng)方法的特征完全一樣。例如: // 程序4-9 class point{ int x, y; point(){ this(0,0);} point(int x, int y){ this.x=x;this.y=y; } double area(){ return 0;} } class circle extends point{ int radius; circle(int r, int x, int y){super(x, y); radius=r; } double area(){ return Math.PI*radius*radius;} } public class testOverWrite { public static void main(String args[ ]){ } circle c1; c1=new circle(1,1,1); System.out.println(c1.area());} 4.8.2 方法的動(dòng)態(tài)調(diào)用 Java的所有對(duì)象運(yùn)行時(shí)都有一個(gè)類型標(biāo)識(shí)(RTTI:Run-Time Type Identification),該標(biāo)識(shí)記錄了每個(gè)對(duì)象所屬于的類。Java用此標(biāo)識(shí)在運(yùn)行時(shí)選擇正確的方法。例如: // 程序4-11 class point{ int x, y; point(){ this(0,0);} point(int x, int y){ this.x=x;this.y=y; } double area(){ return 0;} } class circle extends point{ int radius; circle(int r, int x, int y){ super(x, y); radius=r;} double area(){ // 覆蓋了父類的area方法 return Math.PI*radius*radius; } } public class dynamicalCall { public static void main(String args[ ]){ point p[ ]={new point(2,2), new circle(1,1,1)}; for(int i=0;i System.out.print(“類名: ”+ } p[i].getClass().getName());System.out.print(“父類:”+ p[i].getClass().getSuperclass());System.out.println(“ 面積: ”+ } p[i].area());} 子類對(duì)象調(diào)用方法時(shí): (1)子類檢查是否具有同名和同參數(shù)類型的方法,若有則調(diào)用該方法,否則繼續(xù)執(zhí)行。 (2)到父類中尋找同名和同參數(shù)類型的方法,若有則調(diào)用該方法。若找不到,將產(chǎn)生編譯錯(cuò)誤。 對(duì)象決定自己到底該調(diào)用哪個(gè)方法,取決于該對(duì)象在繼承鏈中的位置。 4.9 多態(tài)性不適合繼承鏈中的實(shí)例變量 引用.方法:根據(jù)多態(tài)性調(diào)用; 引用.實(shí)例變量:根據(jù)引用的類型調(diào)用。即:多態(tài)性僅僅適用于方法的調(diào)用,而不適合實(shí)例變量。例如: class Base{ // 程序4-12 int x=1;void print(){ System.out.println(“當(dāng)前類為 ”+ } this.getClass().getName());System.out.println(“對(duì)象的x= ”+this.x); } class Derived extends Base{ } int x=2;void print(){ System.out.println(“當(dāng)前類為 ”+ } this.getClass().getName());System.out.println(“對(duì)象的x= ”+this.x); public class confusions{ public static void main(String [ ] args){ Base obj=new Derived(); } } obj.print();System.out.println(“對(duì)象的x= ”+obj.x); 4.10 finalize Java的垃圾回收器具有自動(dòng)回收垃圾的能力。 垃圾回收器是一個(gè)優(yōu)先級(jí)比較低的線程,在系統(tǒng)空閑時(shí)運(yùn)行。 在對(duì)象被回收之前,有時(shí)需要執(zhí)行一些特殊的操作,例如保存文件、清除屏幕等,這時(shí)就要用Java的finalize方法。例如: class point{ // 程序4-13 int x, y; point(int a, int b){ } x=a;y=b;System.out.println(“point constructor:”+getString()); public void finalize(){ // 注意該方法 System.out.println(“point finalizer:”+getString()); } String getString(){ return “x=”+x+“ y=”+y; } } class circle extends point{ int radius; circle(int r, int a, int b){ super(a,b);radius=r;System.out.println(“circle constructor:”+getString()); } public void finalize(){ System.out.println(“circle finalizer:”+getString()); } String getString(){ return super.getString()+“ radius=”+radius; } } public class testFinalize { public static void main(String args[ ]){ point c1,c2;c1=new circle(1,1,1);c2=new circle(2,2,2);c1=null;c2=null;System.gc(); } } 4.11 static static修飾變量(與C中的不同); static修飾方法(與C中的不同); 4.11.1 static變量 static變量是指這樣的成員變量:不管在程序運(yùn)行中生成多少個(gè)該類的對(duì)象,它們都共享該變量。 即使沒有創(chuàng)建對(duì)象,該變量仍然存在。因此,static變量又稱為類變量。定義格式為:static type variableName; static變量和一般的實(shí)例變量不同,在構(gòu)造方法中不能對(duì)它進(jìn)行初始化。例如: class point{ // 程序4-14 static int count;int x, y;static{ // 靜態(tài)初始化塊 } } count=0;System.out.println(“static variable is initialized!”); point(int a, int b){ count++;x=a; y=b; System.out.println(“Call point constructor!”);} public class testStaticVariable { public static void main(String args[ ]){ point c1=new point(0,0); System.out.println(“There are ”+ } 4.11.2 static方法 (可舉例說明Math類的PI和sqrt等,為什么要用靜態(tài)變量。)static方法是類中的成員方法,它屬于整個(gè)類,即使不創(chuàng)建任何對(duì)象,也可使用靜態(tài)方法。調(diào)用靜態(tài)方法格式:類名.方法名(參數(shù)); 在子類中不能覆蓋父類中定義的靜態(tài)方法。 靜態(tài)方法中只能出現(xiàn)靜態(tài)變量和其它靜態(tài)方法。并且還不能使用this和super。例如: class point{ // 程序4-15 static int count; int x, y; static{ count=0;System.out.println(“static variable is initialized!”); // 定義靜態(tài)變量 } point.count +“ points”); } point(int a, int b){ count++;x=a;y=b; System.out.println(“Call point constructor!”); } static int getCount(){ // 靜態(tài)方法 return count; } } public class testStaticMethod { public static void main(String args[ ]){ } point c1=new point(0,0);point c2=new point(1,1); System.out.println(“There are ”+ point.getCount()+“ points”);} 4.12 關(guān)鍵字final 在實(shí)例變量、局部變量和方法的形參定義之前加上final,那么這個(gè)變量值只能被引用,而不能修改。 final修飾的局部變量和實(shí)例變量必須給出初值,因?yàn)樗揎椀淖兞看硪粋€(gè)常量。例如: class Base{ // 程序4-16 final int x=1; // 形式1:修飾實(shí)例變量 } public class finalVariables{ public static void main(String [ ] args){ final int var=100;// 形式3:修飾局部變量 } Base obj=new Base(); obj.print(var);void print(final int y){ // 形式2:修飾參數(shù) // y=0; // 錯(cuò)誤 } System.out.println(x+y); } 在方法定義前加上final,該方法就不能被子類覆蓋,成為終極方法 ; 包含終極方法的類仍然可以被子類繼承,子類雖然不能覆蓋父類中的終極方法,但可以重載該方法。例如: class Base{ final int x=1; } class Derived extends Base { void print(){ // 重載了父類中的print方法 } System.out.println(x);final void print(int y){ } // 父類中的final方法 System.out.println(x+y);} 4.12.3 final類 在一個(gè)類定義前加上final,意味著這個(gè)類就不能被其它類繼承,成為終極類。 系統(tǒng)類基本上都是final類,如String類。 將class定義為final是為了杜絕繼承,類中的方法自然都變成了終極方法。例如: final class Base{ // 聲明為final類 final int x=1; void print(final int y){ System.out.println(x+y); } } // 錯(cuò)誤:不能繼承final 修飾的Base類 class Derived extends Base { } 4.13 組合與繼承 面向?qū)ο笾械能浖赜帽憩F(xiàn)為兩種形式:繼承和對(duì)象組合。 設(shè)計(jì)這類程序的關(guān)鍵是構(gòu)造方法:子類構(gòu)造方法調(diào)用父類構(gòu)造、成員對(duì)象的初始化。class date{ // 程序4-17 int year, mon,day; date(int y, int m, int d){ year=y; mon=(m>0 && m<13)?m:1;day=checkday(d); } int checkday(int d){ int daydisp[ ]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if(d>0 && d<=daydisp[mon]) return d; if(mon==2 && d==29 &&(year%400==0 || year%4==0&& year%100!=0)) return d;return 1; } String tostring(){ return year+“/”+mon+“/”+day;} } class employee{ // 雇員類 long id;date birthday; 例如: employee(long no, int year, int mon, int day){ id=no; // 設(shè)置組合對(duì)象 } String tostring(){ return id+“ , ”+birthday.tostring();} birthday=new date(year,mon,day);} class manager extends employee { // 經(jīng)理類 double basePay; String tostring(){ return basePay+“ , ”+super.tostring();} } public class compositionAndInherence { } public static void main(String [ ] args){ manager boss; } boss=new manager(1001,1971,11,5);System.out.println(boss.tostring()); manager(long no, int y, int m, int d){ super(no,y,m,d); // 調(diào)用父類構(gòu)造函數(shù) } basePay=1000; 4.14 抽象類和抽象方法 抽象方法:僅有方法特征,但沒有代碼; 抽象類:包含抽象方法的類。 抽象類的作用:提供一種適當(dāng)?shù)某?,子類通過繼承實(shí)現(xiàn)父類中的抽象方法。 抽象類不能用final修飾。 抽象類體現(xiàn)了多態(tài)性,通過繼承可以從抽象類派生出具有相似操作的子類。例如: abstract instrument abstract void play()繼承 wind void play()繼承 繼承 stringed void play()percussion void play()繼承 繼承 woodwind void play()brass void play() // 程序4-18 abstract class instrument{ abstract void play();} // wind不是抽象類 class wind extends instrument{ void play(){ System.out.println(“wind play!”);} } // percussion也不是抽象類 class percussion extends instrument{ void play(){ System.out.println(“percussion play!”);} } // stringed也不是抽象類 class stringed extends instrument{ void play(){ System.out.println(“stringed play!”);} } class woodWind extends wind{ // 覆蓋父類中的play方法 void play(){System.out.println(“woodWind play!”);} } class brass extends wind{ // 覆蓋了父類中的play方法 void play(){ System.out.println(“brass play!”);} } public class music { static void tuneAll(instrument e[ ]){ } for(int i=0;i e[i].play(); // 抽象方法 public static void main(String [ ] args){ instrument orchestra[ ] = new instrument[5];int i=0; orchestra[i++]=new wind();orchestra[i++]=new percussion();orchestra[i++]=new stringed();orchestra[i++]=new woodWind();orchestra[i++]=new brass();tuneAll(orchestra); } } 程序運(yùn)行結(jié)果: wind play!percussion play!stringed play!woodWind play!brass play! 4.15 對(duì)象的類型轉(zhuǎn)換 4.15.1 向上類型轉(zhuǎn)換 從子類向父類轉(zhuǎn)換,在繼承圖中是向上移動(dòng),通常稱為向上類型轉(zhuǎn)換。 類型向上轉(zhuǎn)換是安全的,因?yàn)檫@是從特殊類型到通用類型的轉(zhuǎn)換。 進(jìn)行向上類型轉(zhuǎn)換時(shí),出現(xiàn)的唯一問題是可能丟失子類中定義的方法和變量。例如: // 程序4-19 class point{ int x, y; point(int x, int y){ this.x=x;this.y=y;} int getX(){ return x;} } class circle extends point{ int radius;circle(int r, int x, int y){ super(x, y);radius=r;} double area(){ return Math.PI*radius*radius; } } public class testUpCasting { } public static void main(String [ ] args){ circle c=new circle(1,1,1);point p=c;// 注意:p和c的類型不同 } System.out.println(p.getX());4.15.2 向下類型轉(zhuǎn)換 從父類向子類轉(zhuǎn)換,在繼承圖中是向下移動(dòng),稱為向下類型轉(zhuǎn)換。 類型向下轉(zhuǎn)換是不安全的,因?yàn)檫@是從一般類型到特殊類型的轉(zhuǎn)換。例如: public static void main(String [ ] args){ } 4.16 訪問權(quán)限限制 Java提供的訪問權(quán)限修飾符有四個(gè),即public、private、protected和友元; 修飾符要置于每個(gè)類成員(實(shí)例變量和成員方法)的定義之前,且僅能控制它所修飾的那個(gè)成員。 4.16.1 友員 缺省修飾符的情況就是友員。友員修飾符意味著同一個(gè)目錄(包)中的所有類都可以訪問這種類型的成員。 friendly不屬于Java關(guān)鍵字,是C++的一個(gè)關(guān)鍵字。 例如: public class Base{ // 該類位于Base.java文件中 int friend_data=1;// 友員數(shù)據(jù)成員 } // 該類位于Derived.java文件中 public class Derived extends Base{ Base p=new Base(); // 訪問Base類中的friend_data } 4.16.2 public 成員 不管兩個(gè)類是否位于同一個(gè)目錄中,一個(gè)類總可以訪問另一個(gè)類的public成員。 public還可以用于修飾主類,文件名必須與主類名一致。除此之外,其它3個(gè)修飾符都不能用于修飾類,只能修飾成員。例如: public class Base{ public int friend_data=1;// public成員 } void dataUse(){ System.out.println(“data=”+p.friend_data); } point p=new point(1,1);circle c;c=p; //注意:此處編譯時(shí)出錯(cuò) c=(circle)p;//注意:此處運(yùn)行時(shí)出錯(cuò) System.out.println(c.area()); public class Derived extends Base{ public Base p=new Base(); public void dataUse(){ } 4.16.3 private成員 private成員的特性:除了其所在類能夠訪問該成員以外,其它類都不能訪問它。 在多人合作開發(fā)一個(gè)系統(tǒng)的過程中,private可以讓你自由使用自己定義的成員,無須擔(dān)心與其他人寫的類相沖突。例如: // 程序4-20 class Base{ private Base(){ } public class testPrivate { public static void main(String args[ ]){ // Base p=new Base(); // 編譯有錯(cuò) } } Base p = Base.makeBase();} // 注意 } System.out.println(“data=”+p.friend_data);} static Base makeBase(){ return new Base(); 4.16.4 protected成員 protected與繼承有關(guān),這種類型的成員可以被子類訪問。 同一個(gè)包內(nèi)的非子類,也可以訪問這種類型的成員。即:protected天生就具有友元權(quán)限,例如: // 程序4-21 class Base{ // 該類位于Base.java文件中 int friend_data=1; // 友元成員 public int public_data=2; // public成員 private int private_data=3;// private成員 protected int protected_data=4;// protected成員 } class Derived extends Base{ // Derived.java文件 Base a=new Base();void dataUse(){ } System.out.println(a.friend_data);System.out.println(a.public_data);// System.out.println(a.private_data);System.out.println(a.protected_data);} // 將主類存放在testData.java文件中 public class testData { public static void main(String args[ ]){ } Derived d=new Derived();d.dataUse(); } 訪問權(quán)限總結(jié) 課堂練習(xí): 1、定義一個(gè)Student類: 該類的功能有:可以保存、修改和獲取學(xué)生的姓名、學(xué)號(hào)等??梢栽O(shè)置學(xué)生的英語成績(jī)、數(shù)學(xué)成績(jī)、Java成績(jī),并能計(jì)算平均分、最高分和最低分。 2、以下代碼定義了一個(gè)類,請(qǐng)指出其中三條不合法的代碼行(行號(hào)參見注釋)。 class Test22{ //1 //7 } static float fac1(boolean f){ return f?u:v;} //8 float fac2(boolean f){ return f?u:v;} //9 float u; //2 static float v; //3 static void setUV(boolean f){ //4 u=fac1(f); //5 v=fac2(!f); //6 } 課外練習(xí)(作業(yè)): P87 1、3、4、6 第5章 接口和包 教學(xué)目的要求 ? 掌握接口的定義和使用 ? 了解接口與抽象類的異同點(diǎn) ? 掌握包的定義和使用 主要內(nèi)容 ? 接口的定義和使用 ? 包的定義和使用 重點(diǎn)內(nèi)容 ? 接口的定義和使用 ? 包的定義和使用 難點(diǎn)內(nèi)容 無 1課時(shí) 課時(shí)分配 教學(xué)方法 講授法、演示法 講授內(nèi)容提要 5.1 接口 引入接口的原因:在程序設(shè)計(jì)中經(jīng)常遇到這樣一個(gè)問題:有些類互不相關(guān),但卻具有相似的方法。并且這些方法在各個(gè)類中的實(shí)現(xiàn)互不相同。我們不能為這些類定義一個(gè)共同的父類,但又希望在程序中體現(xiàn)出它們共同的接口。 5.1.1 接口的定義和應(yīng)用 接口是一系列常量和空方法的集合,它提供了多個(gè)類共同的方法,但不限制每個(gè)類如何實(shí)現(xiàn)這些方法。 Java允許一個(gè)類同時(shí)實(shí)現(xiàn)多個(gè)接口,相當(dāng)于實(shí)現(xiàn)多繼承的功能。聲明一個(gè)接口的語法格式: [public] interface interfaceName [extends super-interface-List]{ type ConstantName=value; type MethodName(Parameter lists);} 例如: interface Sortable{ // 定義一個(gè)接口 int Compare(Sortable s);} 接口中不能聲明任何變量和構(gòu)造方法。 如果一個(gè)類實(shí)現(xiàn)多個(gè)接口,應(yīng)該在接口名之間用逗號(hào)隔開。 當(dāng)一個(gè)類實(shí)現(xiàn)接口時(shí),必須實(shí)現(xiàn)接口中給出的空方法,若實(shí)現(xiàn)接口的類是一個(gè)抽象類,可以把實(shí)現(xiàn)接口的任務(wù)交給子類去實(shí)現(xiàn)。例如: // 程序5-1 interface Sortable{ // 定義一個(gè)接口 int Compare(Sortable s);} class Sort{ // 定義一個(gè)排序類,僅有一個(gè)靜態(tài)的方法 public static void SelectSort(Sortable a[ ]){ int i, j, k;Sortable temp; for(i=0;i // 選擇排序 k=i; for(j=i+1;j if(a[k].Compare(a[j])<0)k=j; temp=a[i];a[i]=a[k];a[k]=temp;} } } class Student implements Sortable{ // 定義一個(gè)學(xué)生類 private int score; Student(int x){score=x;} // 實(shí)現(xiàn)接口Sortable中的方法 public int Compare(Sortable s){ Student st=(Student)s; // 類型強(qiáng)制轉(zhuǎn)換 return score-st.score;} public String toString(){ return “score=”+score;} } class Rectangle implements Sortable{ // 矩形類也實(shí)現(xiàn)了接口 } public class interfaceTest { public static void main(String args[ ]){ Student stud[ ]=new Student[20];int i;private int length,width; Rectangle(int x,int y){ length=x;width=y;} int area(){return length*width;} public int Compare(Sortable s){ // 實(shí)現(xiàn)接口 } public String toString(){ return “area=”+area();} Rectangle rec=(Rectangle)s; // 類型強(qiáng)制轉(zhuǎn)換 return area()-rec.area(); for(i=0;i stud[i]=new Student((int)(Math.random()*100));Sort.SelectSort(stud); // 排序 for(i=0;i System.out.println(stud[i].toString());Rectangle R[ ]=new Rectangle[10];for(i=0;i R[i]=newRectangle((int)(Math.random()*10),(int)(Math.random()*10));Sort.SelectSort(R); // 排序 for(i=0;i System.out.println(R[i].toString()); } } 接口中定義的變量實(shí)際上是常量,必須給出它們的初始值,實(shí)現(xiàn)接口的類可以自由引用這些常量。例如: // 程序5-2的部分 interface constant { int int int int EXCELLENT=5; GOOD=4; PASS=3; FAIL=2;} 在類中實(shí)現(xiàn)接口中方法時(shí),方法的特征必須和接口中聲明的方法特征保持一致; 實(shí)現(xiàn)方法時(shí)必須在方法前加上public; 若一個(gè)類沒有對(duì)接口中的方法具體實(shí)現(xiàn),那么必須將該類聲明為abstract類。例如: interface inter { // 接口 } void methodA(); abstract class Derived1 implements inter { // 此處不需要寫出methodA()的原型 } class Derived2 extends Derived1{ public void methodA(){ // 實(shí)現(xiàn)方法 } } System.out.println(“Hi,methodA”);5.1.2 接口和抽象類的異同點(diǎn) 接口和抽象類的相同點(diǎn): (1)都有空的方法,都必須在子類中實(shí)現(xiàn)這些方法。 (2)都不能用new關(guān)鍵字來創(chuàng)建這兩種類型的對(duì)象。 (3)都可以具有繼承關(guān)系。 (4)接口和類一樣可以具有public屬性。接口和抽象類的不同點(diǎn): (1)在抽象類中,空的方法必須加abstract關(guān)鍵字,而在接口中不需要。 (2)在抽象類中,除空的方法外,可以定義實(shí)例變量和非空的方法,而在接口中,只能定義常量和空的方法。 (3)接口允許多繼承,類僅支持單繼承。 5.2 包 在Java中可以將自己寫的類,按一定的方法歸屬于不同的子目錄中(包)。 在缺省情況下,Java將所有的類歸屬一個(gè)缺省包中。在不同的包中可以有同名的類存在。 Java中的包與C++中的名字空間相似。 5.2.1 package語句 package語句告訴編譯器當(dāng)前類屬于哪個(gè)包。如果沒有package語句,類就存放在無名的缺省包中(即當(dāng)前目錄中)。 引進(jìn)包的概念主要是為了名字沖突。 格式: package pkgl[.pkg2[.pkg3]]; 5.2.2 import語句 import語句位于package語句之后,類的定義之前;格式:import package1[.package2].(class-name | *); 采用*號(hào)不影響程序的運(yùn)行性能,但會(huì)影響編譯速度。指明具體類比引入整個(gè)包更為合理。5.2.3 包應(yīng)用舉例 package Base; // 將該類存放在d:myjavaBase包中 public class Base { int friend_data=1;// 友元成員 public int public_data=2;// public成員 private int private_data=3;// private成員 protected int protected_data=4;// protected成員 } package Derived; // 將Base類存放在Derived包中 import Base.*; // 需要使用Base包中的類 public class Derived extends Base{ Base a=new Base(); // 為了讓testData類能調(diào)用該方法,修改為public // 不能訪問 public void dataUse(){ // System.out.println(a.friend_data); System.out.println(a.public_data); // System.out.println(a.private_data); // 不能訪問 // System.out.println(a.protected_data);// 不能訪問 } } // testData.java文件的內(nèi)容如下: import Derived.*; //需要使用Derived包中的類 // 該類位于工作目錄,不需要package語句 public class testData { public static void main(String args[ ]){ } } Derived d=new Derived(); d.dataUse(); 課堂練習(xí): 課外練習(xí)(作業(yè)): P108 3~6 第6章 字符串處理 教學(xué)目的要求 ? 掌握字符串的分類; ? 掌握內(nèi)容不可改變的字符串類String; ? 掌握字符串常量; ? 掌握內(nèi)容可以改變的字符串類StringBuffer; ? 掌握字符串應(yīng)用。 主要內(nèi)容 ? 字符串的分類; ? ? ? ? 內(nèi)容不可改變的字符串類String; 字符串常量; 內(nèi)容可以改變的字符串類StringBuffer; 字符串應(yīng)用。 重點(diǎn)內(nèi)容 ? 掌握內(nèi)容不可改變的字符串類String; ? 掌握內(nèi)容可以改變的字符串類StringBuffer; ? 掌握字符串應(yīng)用。 難點(diǎn)內(nèi)容 String和StringBuffer的區(qū)別和聯(lián)系 課時(shí)分配 2課時(shí) 教學(xué)方法 講授法、演示法、對(duì)比法、實(shí)驗(yàn)驗(yàn)證法 講授內(nèi)容提要 6.1 字符串的分類 java.lang包中定義了 String和StringBuffer兩個(gè)類; 在運(yùn)行中值不會(huì)改變的字符串,用String類存儲(chǔ);值會(huì)改變的字符串用StringBuffer類來存儲(chǔ)。 兩個(gè)類都有final修飾,這樣可以優(yōu)化字符串的操作。 6.2 String類 String類的定義原型 : public final class java.lang.String extends java.lang.Object { … } 6.2.1 字符串常量 字符串常量屬于String類型;相同的字符串常量屬于同一個(gè)對(duì)象,占用同一塊空間,例如: // 程序6-1 public class TestConstString{ public static void main(String args[ ]){ } } String str1=“Hello”, str2=“Hello”; System.out.println(str1==str2);System.out.println(“Java”==“Java”);6.2.2 創(chuàng)建String類對(duì)象 用new運(yùn)算符,并調(diào)用構(gòu)造函數(shù)創(chuàng)建這種類型的對(duì)象,常見構(gòu)造函數(shù)如下: 1.public String()采用該構(gòu)造函數(shù)創(chuàng)建一個(gè)不含字符的空對(duì)象。例如: String str =new String(); 2.public String(char value[ ]) 將字符數(shù)組的內(nèi)容轉(zhuǎn)換為字符串,并賦予新建的對(duì)象。例如: char a[ ]={'J','a','v','a'};String str=new String(a);3.public String(char value[ ], int offset, int count) 例如:char a[ ]={'J','a','v','a'}; String str=new String(a,1,2); // 字符串str的內(nèi)容是“av” 4.public String(String value) 采用value對(duì)象的值構(gòu)造一個(gè)新的string對(duì)象。 例如: String str1=“Java”;String str2=new String(“Java”); System.out.println(str2); System.out.println(str1==str2); 5.public String(StringBuffer Buffer)注意采用字符串常量初始化一個(gè)String引用的問題。例如: String str = “abc”;相當(dāng)于: char data[ ] = {'a', 'b', 'c'};String str = new String(data);應(yīng)用舉例,注意程序6-2的輸出結(jié)果: public class TestString{ // 程序6-2 public static void main(String args[ ]){ String s1=“Java”, s2=“Java”;String s3=new String(s1); System.out.println(“ s1==s2 is ”+(s1==s2));System.out.println(“ s1==s3 is ”+(s1==s3));s1=“ABC”;s2=“DEFG”;System.out.println(“ s1==s2 is ”+(s1==s2));s1=s2; System.out.println(“ s1==s2 is ”+(s1==s2));} } 6.2.3 String類常用方法 1.public int length(): 求串長(zhǎng)。例如: String str=“Java” ; System.out.println(str.length());2.public char charAt(int index) 提取指定位置上的字符。 3.public int compareTo(String anotherString) 對(duì)字符串內(nèi)容按字典序進(jìn)行大小比較。例如: public class SortStringArrary{ // 程序6-3 public static void main(String args[ ]){ String str,s[ ]={“Computer”,“CHINA”,“world”,“U.S.A”}; int i,j,k; System.out.print(“排序之前:”);for(i=0;i System.out.print(“t”+s[i]);for(i=0;i for(k=i,j=i+1;j if(s[k].compareTo(s[j])>0) k=j; str=s[i]; s[i]=s[k]; s[k]=str;// 注意該行的含義 } System.out.print(“n排序之后:”);for(i=0;i System.out.print(“t”+s[i]); } } 4.char[ ] toCharArray() 將String對(duì)象轉(zhuǎn)換到一個(gè)字符數(shù)組中,例如: String s=“Hello,Java!”; char a[ ]; a=s.toCharArray(); for(int i=6;i System.out.print(a[i]);5.public boolean equals(String anString) 比較兩個(gè)字符串對(duì)象的內(nèi)容是否相等。 6.public boolean equalsIgnoreCase(String anotherString) 以忽略大小寫方式,比較兩個(gè)字符串對(duì)象的內(nèi)容是否相等。 注意:equals()方法與“==” 之間的區(qū)別。例如: public class ConfuseQuestion{ // 程序6-5 public static void main(String args[ ]){ String s1=“java”; String s2=new String(s1); String s3=s2; } } System.out.println(s1.equals(s2));System.out.println(s2.equals(s3));System.out.println(s2==s3);System.out.println(s2.equals(s3));7.public int indexOf(int ch / String str) 在字符串中搜索字符或子串,返回字符或子串在String對(duì)象中從左邊起首次出現(xiàn)的位置。如果沒有出現(xiàn),返回-1。 8.public String substring(int begin, int end) 提取string對(duì)象中從begin開始,到end-1結(jié)束的子串,返回提取的子串。 9.public String concat(String str)將str對(duì)象接到調(diào)用對(duì)象的后面,返回新串。例如: String s1=“Hello ” , s2=“Java” , s3;s3=s1.concat(s2); System.out.println(s3);注意:如果參數(shù)str為空(null),則concat方法不創(chuàng)建新串,而僅僅返回當(dāng)前串,10.public String replace(char oldChar, char newChar) 將String對(duì)象中所有的oldChar字符替換為newChar,返回替換后的新串。例如: String path=“d:/myjava/documents”; System.out.println(path.replace('/' , '')); public String toString() 返回當(dāng)前字符串對(duì)象本身。 12.public static String valueOf(各種類型 f) 將各種數(shù)據(jù)類型轉(zhuǎn)換成一個(gè)相應(yīng)的字符串表示,該方法是一個(gè)static方法。 程序6-6演示了valueOf()方法的應(yīng)用。 程序6-7自學(xué)。 public class TestValueOf{ // 程序6-6 public static void main(String args[ ]){ char a[ ]={'A','B','C','D','E','F'}; int i=123456;float f=3.14159f;boolean b=true;Object o=null;System.out.println(String.valueOf(a));System.out.println(String.valueOf(a,2,3));System.out.println(String.valueOf(i));System.out.println(String.valueOf(f));System.out.println(String.valueOf(b)); System.out.println(String.valueOf(o));} } 6.2.4 Java應(yīng)用程序的命令行參數(shù) 應(yīng)用程序可以通過main方法的String數(shù)組,訪問由解釋器傳遞的命令行參數(shù)。例如: public class ShowMainArguments{ //程序6-8 public static void main(String args[ ]){ for(int i = 0;i < args.length;i++) System.out.println(args[ i ]); } } 6.3 StringBuffer類 StringBuffer類對(duì)象是一個(gè)內(nèi)容可以改變的字符串。可以減少由于少量字符的插人而引起的空間分配問題。 StringBuffer類的原型: public final class java.lang.StringBuffer extends java.lang.Object { … } StringBuffer類對(duì)象有一塊緩沖區(qū),字符串被存放在緩沖區(qū)中,緩沖區(qū)的大小可以隨程序的需要進(jìn)行調(diào)整。緩沖區(qū)的大小稱為對(duì)象的容量。 當(dāng)修改對(duì)象的內(nèi)容時(shí),只要StringBuffer對(duì)象包含的字符個(gè)數(shù)沒有超出容量,就不會(huì)分配新的空間,而直接在原空間內(nèi)進(jìn)行修改。若字符的個(gè)數(shù)超出了容量,該對(duì)象會(huì)自動(dòng)調(diào)整其容量,從而適應(yīng)新的存儲(chǔ)。 6.3.1 創(chuàng)建StringBuffer類對(duì)象 StringBuffer類的構(gòu)造函數(shù)有三種方式: 1.public StringBuffer()創(chuàng)建一個(gè)內(nèi)容為空的StringBuffer對(duì)象,容量為16。 例如:StringBuffer s=new StringBuffer();2.public StringBuffer(int length)初始內(nèi)容為空,容量為length指定的大小。注意:length應(yīng)大于等于0,不能為負(fù)數(shù),否則會(huì)產(chǎn)生異常。例如: StringBuffer s2=new StringBuffer(2);3.public StringBuffer(String str) 初始內(nèi)容和參數(shù)str的內(nèi)容相同,容量為參數(shù)str的長(zhǎng)度加上16。例如: String s1=“Java”; StringBuffer s2=new StringBuffer(s1);則s2的容量是20,內(nèi)容是“Java”。 6.3.2 StringBuffer類常用方法 1.public int length() 返回字符串的長(zhǎng)度 2.public int capacity() 返回緩沖區(qū)大小 3.public void setLength(int newLength) 指定對(duì)象的長(zhǎng)度,將對(duì)象的內(nèi)容進(jìn)行裁減。如果參數(shù)小于對(duì)象的長(zhǎng)度,則將對(duì)象截?cái)?;如果參?shù)大于等于對(duì)象的長(zhǎng)度,則填充空字符('u0')擴(kuò)充新增加的部分。 4.public void ensureCapacity(int NewCapacity) 設(shè)定對(duì)象的緩沖區(qū)的大小,若參數(shù) 小于對(duì)象的容量,則新的設(shè)置將不起作用,也就是說容量只能擴(kuò)大而不能縮小。 程序6-9演示了這幾個(gè)方法的具體應(yīng)用。 public class TestCapacity{ // 程序6-9 public static void main(String args[ ]){ String s=“Java”; StringBuffer str=new StringBuffer(s);System.out.println(“Length=”+str.length());System.out.println(“Capacity=”+str.capacity());str.setLength(8); // 設(shè)置長(zhǎng)度為8 str.ensureCapacity(80);// 設(shè)置容量為80 System.out.println(“nstr= ”+str);System.out.println(“Length = ”+str.length());System.out.println(“capacity = ”+str.capacity()); str.setLength(3); str.ensureCapacity(20);System.out.println(“nstr= ”+str);System.out.println(“Length = ”+str.length());System.out.println(“capacity = ”+str.capacity()); } } 5.public void setCharAt(int index, char ch) 將參數(shù)index指定位置上的字符,設(shè)置成參數(shù)ch 指定的字符。例如: StringBuffer str=new StringBuffer(“Hello,Java”); str.setCharAt(3,'L'); 則str的內(nèi)容變成了“HelLo,Java” 6.public StringBuffer append(多種數(shù)據(jù)類型) 將其它類型的數(shù)據(jù)添加到StringBuffer對(duì)象的尾部,返回修改后的StringBuffer對(duì)象。 例如:StringBuffer s1,s2=new StringBuffer(); s1=s2;// s1和s2代表同一個(gè)對(duì)象 s2.append(3.14).append(' ').append(“Java”); System.out.println(s1==s2); // 輸出true System.out.println(s1); // 輸出3.14 Java 7.public String toString() 該方法把StringBuffer對(duì)象的內(nèi)容復(fù)制到一個(gè)新的String類對(duì)象中,返回這個(gè)新的String類對(duì)象。例如程序6-10。 public class BufferToString{ // 程序6-10 public static void main(String args[ ]){ String s1;StringBuffer s2=new StringBuffer(“Hello ”);s1=s2.append(“Java!”).toString();System.out.println(“s1=”+s1+“"+”s2=“+s2); } } 8.public StringBuffer insert(int offset, 多種類型 b)該方法是將一個(gè)其它類型的對(duì)象b插入到offset指定的位置。例如: StringBuffer str=new StringBuffer(” Java!“); // 將字符串”Hello“插入到下標(biāo)為0的位置 str.insert(0,”Hello“); System.out.println(”str= “+str);輸出結(jié)果為: str= Hello Java! 6.4 略 應(yīng)用舉例 課堂練習(xí): 無 課外練習(xí)(作業(yè)): P119 2、3、4 第7章 異常處理 教學(xué)目的要求 ? 了解異常的層次結(jié)構(gòu); ? 掌握異常處理語句; ? 了解自定義異常; ? 了解異常處理中常用的調(diào)試方法。主要內(nèi)容 ? ? ? ? 異常的層次結(jié)構(gòu); 異常處理語句; 自定義異常; 異常處理中常用的調(diào)試方法。 重點(diǎn)內(nèi)容 ? 異常處理語句; 難點(diǎn)內(nèi)容 無 課時(shí)分配 1課時(shí) 教學(xué)方法 講授法、演示法、對(duì)比法、實(shí)驗(yàn)驗(yàn)證法 講授內(nèi)容提要 7.1 異常的層次結(jié)構(gòu) Throwable是異常類的根節(jié)點(diǎn),定義在java.lang包,它的子類也定義在該包中; Error代表系統(tǒng)錯(cuò)誤類,由系統(tǒng)直接處理; Exception類及其子類是在程序中可捕捉到的異常。見圖7.1 Throwable Error achineError … AW TError LinkageError VirtualM RuntimeException ArithmeticException ArrayIndexO utO fBoundsException … Interrupted Exception AWTException IOException Exception FileNotFoundException… EOFException 1.java.lang.ArithmeticException 0作除數(shù)(包括模),將產(chǎn)生這類異常。例如:int x=0 , y; y=100/x; 2.java.lang.ArrayIndexOutOfBoundsException 例如:int a[ ]=new int[10]; a[10]=0; 3.java.lang.ArrayStoreException 例如:int a[ ]=new int[10]; boolean b[ ]=new boolean[10]; System.arraycopy(a,0,b,3,6);//有異常 4.java.lang.ClassCastException 例如: Object obj=new Object(); int a[ ]=(int[ ])(obj); 5.java.lang.IndexOutOfBoundsException 例如:char ch=”ABC“.charAt(99); 注意: 2 是5的子類。 6.java.lang.NegativeArraySizeException 例如: int a[ ]=new int[-10]; 7.java.lang.NullPointerException 例如:int a[ ]=null; System.out.print(a.length);7.2 異常處理語句 缺省的異常處理的情況,例如: public class DefaultException{ // 程序7-1 public static void main(String args[ ]){ int a,b=0; a=2/b; // 此處有異常 System.out.println(“a=”+a);// 不運(yùn)行此行 } } 異常處理語句有try、catch、finally、throw和throws。異常處理的形式為: try{ 程序執(zhí)行體 }catch(異常類型1 異常對(duì)象1){ 異常處理程序體1 }catch(異常類型2 異常對(duì)象2){ 異常處理程序體2 }finally { 異常處理結(jié)束前的執(zhí)行程序體 } 7.2.1 try和catch語句 try語句指明可能產(chǎn)生異常的代碼段;catch語句在try語句之后,用于捕捉異常,一個(gè)try語句可以有多個(gè)catch語句與之匹配。異常處理以后,程序從try語句代碼段后繼續(xù)執(zhí)行。例如:程序7-2。public class TryCatchTest{ // 程序7-2 public static void main(String args[ ]){ int a=99,b=0,c; try{ System.out.println(”產(chǎn)生異常之前“);c=a/b; // 該行有異常 System.out.println(”產(chǎn)生異常之后“);}catch(ArrayIndexOutOfBoundsException e){ System.out.println(”處理下標(biāo)越界異?!?;}catch(ArithmeticException e){ System.out.println(”處理算術(shù)異?!?;} System.out.println(”異常處理結(jié)束“); } } 注意:用catch語句捕捉異常時(shí),若找不到相匹配的catch語句,將執(zhí)行缺省的異常處理。例如: int a=99,b=0,c; try{ c=a/b;//產(chǎn)生的異常和捕捉的異常類型不一致 }catch(ArrayIndexOutOfBoundsException e){ System.out.println(”處理異?!?; } 注意:當(dāng)有多個(gè)catch語句時(shí),系統(tǒng)依照先后順序逐個(gè)檢查。例如: try{ c=a/b; }catch(ArithmeticException e){ System.out.println(”Divided by zero“);}catch(RuntimeException e){ System.out.println(”Divided by zero“);} 7.2.2 finally語句 無論是否產(chǎn)生異常,finally語句指明的代碼一定被執(zhí)行。例如: public class testFinally{ // 程序7-3 public static void main(String args[ ]){ int a,b=0; for(int i=0;i<=3;i++){ System.out.println(”Test No: “+(i+1));try{ switch(i){ } case 0: a=3/b; break;case 1: int c[ ]=new int[10]; c[10]=0; break;case 2: char ch=”ABC“.charAt(99); break;case 3: return;}catch(ArithmeticException e){ System.out.println(“零作除數(shù)!”); }catch(ArrayIndexOutOfBoundsException e){ System.out.println(”數(shù)組下標(biāo)越界!“);}catch(IndexOutOfBoundsException e){ System.out.println(”下標(biāo)越界!“);}finally{ System.out.println(”在finally塊中!“); } } 7.2.3 throw語句 throw語句用于指出當(dāng)前行有異常,當(dāng)程序執(zhí)行到throw語句時(shí),流程就轉(zhuǎn)到相匹配的異常處理語句,所在的方法也不再返回值。 throw語句可以將異常對(duì)象提交給調(diào)用者,以進(jìn)行再次處理。例如:程序7-4。public class ThrowException{ // 程序7-4 public static void Test(){ try{ int c[ ]=new int[10];c[10]=0;}catch(ArrayIndexOutOfBoundsException e){ System.out.println(”t 數(shù)組下標(biāo)越界!“); } } throw e; // 異常拋出點(diǎn) //System.out.println(“t產(chǎn)生異常后!”); 該行無法通過編譯 } } public static void main(String args[ ]){ try{ Test();}catch(IndexOutOfBoundsException e){ System.out.println(”t 下標(biāo)越界!“);}finally{ System.out.println(”t 在finally塊中!“);} } } 7.2.4 throws語句 throws語句指明方法中可能要產(chǎn)生的異常類型,由調(diào)用者進(jìn)行異常處理。例如: import java.io.*; // 程序7-6 public class testThrows { public static String readString()throws IOException{ int ch;String r=”“;boolean done=false; while(!done){ ch=System.in.read(); } if(ch<0 || ch==0xd) done=true;else r = r +(char)ch; return r; } public static void main(String args[ ]){ String str; try{ str=readString();}catch(IOException e){ System.out.println(”產(chǎn)生了輸出/輸出異?!?; return;} System.out.println(”整數(shù)是:"+Integer.parseInt(str)); } } 建議:在多人合作寫程序時(shí),一個(gè)方法中產(chǎn)生的異常,最好在該方法中進(jìn)行處理,不要將異常傳播給其他人處理。 7.3 自定義異常類 通過繼承Exception類或它的子類,實(shí)現(xiàn)自定義異常類; 對(duì)于自定義異常,必須采用throw語句拋出異常,這種類型的異常不會(huì)自行產(chǎn)生??傮w上分為兩步: 第1步:定義異常類。例如: class userException extends Exception{ int n=0; // 計(jì)數(shù)器 Java程序設(shè)計(jì) 第一講 緒論 一、安裝netbean系統(tǒng) 二、hello world 典型程序結(jié)構(gòu)中各部分的說明: /* * To change this template, choose Tools | Templates * and open the template in the editor.*/ package test1; //@author Jie public class Test1 { public static void main(String[] args){ System.out.println(“Hello World!”); } } 1、注釋語句 2、類定義的包:package 3、public class Test1,定義類,類名稱是Test1,屬性為public 4、public static void main(String[] args),main函數(shù) 5、main函數(shù)的函數(shù)體{ System.out.println(“Hello World!”); } 三、Java程序設(shè)計(jì)語言的基本內(nèi)容: 數(shù)據(jù)類型 運(yùn)算符&表達(dá)式 3 程序控制語句 4 數(shù)組 5 類 6 對(duì)象 7 繼承 8 接口 9 包 APPLET 11 異常處理 12 線程 13 字符串 14 GUI 15 輸入輸出系統(tǒng) 我們的課堂教學(xué)內(nèi)容:時(shí)間17周,包括17次課堂教學(xué),17次實(shí)驗(yàn)室上機(jī)。 四、幾個(gè)案例: 1、計(jì)算根號(hào)2; 2、顯示1-100 3、從1加到100 4、打印一個(gè)“*”組成的10*10的矩形 5、求N!,遞歸算法 6、GUI的例子,在GUI界面下輸入和顯示(this.jLabel1.setText(this.jTextField1.getText());) 7、演示幾個(gè)復(fù)雜一點(diǎn)例子 五、Java語言中保留的關(guān)鍵字: Java語言一共使用了48個(gè)保留關(guān)鍵字,他們主要可以 分為如下幾類。 1.訪問控制 private , protected , public.2.類、方法和變量修飾符 abstract , class , extends , final , implements , interface, native(用于與其他語言的接口), new , static strictfp:java 語言采用固定的位數(shù)來存儲(chǔ)浮點(diǎn)型數(shù)據(jù),但是有些處理器使用更高位的浮點(diǎn)寄存器,這些寄存器增加了中間過程的計(jì)算精度。例如double類型數(shù)據(jù)jvm采用64為存儲(chǔ),二有些處理器使用80位的浮點(diǎn)寄存器來保存中間數(shù)據(jù)。例如:double w = x*y/z;很多處理器計(jì)算x*y后將中間結(jié)果存儲(chǔ)在80位的寄存器中,再除以z并將結(jié)果截?cái)酁?4位;但是這個(gè)結(jié)果可能會(huì)與始終在64位機(jī)器上計(jì)算的結(jié)果不一致,如果將所有的中間結(jié)果都截?cái)啵赡軙?huì)導(dǎo)致溢出,而截?cái)嗖僮魍瑯有枰獣r(shí)間,計(jì)算速度比較慢。 因此JVM默認(rèn)允許中間結(jié)果精度擴(kuò)展。但是在使用關(guān)鍵字strictfp標(biāo)記的方法,必須使用嚴(yán)格的浮點(diǎn)計(jì)算。使用strictfp標(biāo)記的類中所有的方法都必須嚴(yán)格按照浮點(diǎn)計(jì)算。 synchronized:多線程同步訪問控制 transient:transient 關(guān)鍵字表示在Serializable 的時(shí)候不保存該值 volatile:Volatile修飾的成員變量在每次被線程訪問時(shí),都強(qiáng)迫從共享內(nèi)存中重讀該成員變量的值。而且,當(dāng)成員變量發(fā)生變化時(shí),強(qiáng)迫線程將變化值回寫到共享內(nèi)存。這樣在任何時(shí)刻,兩個(gè)不同的線程總是看到某個(gè)成員變量的同一個(gè)值。 3.程序控制語句 break, continue, return, do, while, if, else, for, instanceof, switch, case,default, 4.錯(cuò)誤處理 catch 捕獲, finally 最后, throw 投試, throws 投試, try 嘗試 5.包相關(guān) import 輸入, package 包.6.基本類型 boolean 布爾型, byte 字節(jié)型, char 字符型, double 雙精度, float 浮點(diǎn), int 整型, long 長(zhǎng)整型, short 短整型 7.變量引用 super 特殊, this 這個(gè), void 無值 除了這48個(gè)關(guān)鍵字以外,還有3個(gè)語法保留字: null 空, true 真, false 假.六、如何學(xué)習(xí)一門程序設(shè)計(jì)語言 1、理解什么是程序設(shè)計(jì)語言 2、練習(xí)、練習(xí)、再練習(xí) 第二講 數(shù)據(jù)類型、運(yùn)算符與表達(dá)式 一、Java語言中的數(shù)據(jù)類型 數(shù)據(jù)類型 大小 范圍 默認(rèn)值 byte(字節(jié)) -12832768 0 int(整型) -2147483648-2147483648 0 long(長(zhǎng)整型) -***7808-***7808 0 float(浮點(diǎn)型) 32-3.40292347E+38-3.40292347E+38 0.0f double(雙精度) -1.797693***E+308-1.797693***E+308 0.0d char(字符型) ? u0000-+=!~ +(一元)-(一元) 左?右 * / % 右?左 +(二元)-(二元) 右?左 << >> >>> 右?左 < > <= >= instanceof 右?左 = =!= 右?左 & 右?左 ^ 右?左 | 右?左 && 右?左 || 右?左 ?: 左?右 = *= /= %= += -= <<= >>= >>>= &= ^= |= 左?右 三、實(shí)驗(yàn)課任務(wù) 1、熟悉netbeans的工作環(huán)境,自己編寫HELLO WORLD程序 2、輸入并運(yùn)行測(cè)試,至少10個(gè)不同運(yùn)算符號(hào)組合的算術(shù)表達(dá)式 3、輸入并運(yùn)行測(cè)試,至少5個(gè)不同運(yùn)算符號(hào)組合的邏輯表達(dá)式 4、聯(lián)系字符串對(duì)象的基本用法:聲明賦值對(duì)象,顯示對(duì)象,兩個(gè)字符串連接,截取子串等 第三講 輸入輸出 一、介紹數(shù)據(jù)流的概念 1、流的基本概念 2、字節(jié)流 字節(jié)是8比特,等價(jià)于0-255范圍的十進(jìn)制數(shù)。字節(jié)是計(jì)算機(jī)中最基本的編碼單位。如字符型是2個(gè)字節(jié),浮點(diǎn)型是4個(gè)字節(jié)。 字符流的頂層包括inputstream和outputstream兩個(gè)抽象類??梢酝ㄟ^fileinoutstream和fileoutputstream兩個(gè)子類對(duì)文件進(jìn)行輸入和輸出。通過datainputstream和dataoutputstream兩個(gè)子類處理整數(shù)、浮點(diǎn)數(shù)等數(shù)據(jù)。 3、字符流 字符流是特殊的字節(jié)流,專門用于處理字符數(shù)據(jù),目前的字符集通常是unicode,16比特,一個(gè)字符是兩個(gè)字節(jié)。 頂層有兩個(gè)抽象類:reader和writer,有兩個(gè)最主要的方法:read(),write() 4、預(yù)定義流 標(biāo)準(zhǔn)輸入流:in 標(biāo)準(zhǔn)輸出流:out 出錯(cuò)流:err 舉例: 輸出一串字符,在顯示器上顯示出來 二、文件字節(jié)流 1、文件字節(jié)流的輸入輸出 常用方法: read(),write(ch)案例1:在顯示器上顯示文本文件的內(nèi)容。案例2:復(fù)制文件 2、文件字節(jié)流的隨機(jī)訪問 常用方法: 1、讀數(shù)據(jù)方法:readInt()readBoolean()readLine() 2、寫數(shù)據(jù)方法:wirteChar()writerDouble() 3、指針控制方法: long getFilePointer();void seek(long pos);int skipBytes(int n)案例:建立一個(gè)可讀寫隨機(jī)訪問文件,寫入10個(gè)浮點(diǎn)數(shù),然后關(guān)閉該文件。再次以讀寫方式打開該文件,修改其中第3個(gè)數(shù)據(jù),然后關(guān)閉該文件。再次以只讀方式打開蓋文件,顯示文件內(nèi)容,然后關(guān)閉該文件。 三、過濾流 過濾流是對(duì)輸入輸出流提供了一種包裝。我們主要介紹一組: DataInputStream DataOutputStream 案例:從鍵盤輸入一些同學(xué)的信息,將信息保存到文件中。 四、字符流 五、File類 六、對(duì)象的串行化 第四講 程序控制語句 第五講 綜合練習(xí)第六講 數(shù)組 第七講 函數(shù)、函數(shù)調(diào)用、遞歸函數(shù) 第八講 綜合練習(xí)第九講 類和對(duì)象 第十講 繼承、接口和包與異常處理 第十一講 綜合練習(xí)第十二講APPLET、GUI 第十三講 線程 第十四講 綜合練習(xí) 第十五講 字符串及信息處理的應(yīng)用 第十七講 綜合練習(xí) Java使用教材: 程序設(shè)計(jì)課程教案(普通版) Java程序設(shè)計(jì)教程,雍俊海主編,清華大學(xué)出版社,2007,國家十一五規(guī)劃教材 主要參考書: 《Java語言程序設(shè)計(jì)》,郎波,清華大學(xué)出版社,2005年5月?!禞ava程序設(shè)計(jì)教程》,施霞萍等.機(jī)械工業(yè)出版社,2006 《Java編程思想第3版》,[美]??藸?Eckel,B.)著,陳昊鵬等譯.機(jī)械工業(yè)出版社,2005J 《JAVA軟件開發(fā)(第二版)》,Russel Winder&Graham Roberts著,竇巍 譯,人民郵電出版社,2004.2 課程總體目標(biāo) 本課程是軟件工程專業(yè)開設(shè)的學(xué)科基礎(chǔ)課。本課程的教學(xué)任務(wù)是通過Java程序設(shè)計(jì)的課堂講授、課內(nèi)實(shí)驗(yàn),課外自主試驗(yàn)等教學(xué)環(huán)節(jié),培養(yǎng)學(xué)生程序設(shè)計(jì)使用Java語言進(jìn)行程序設(shè)計(jì)的基本能力,并且養(yǎng)成學(xué)生良好的編程習(xí)慣和規(guī)范的編程風(fēng)格。使學(xué)生掌握較扎實(shí)的 Java 語言基礎(chǔ),理解面向?qū)ο蟪绦蛟O(shè)計(jì)的思想,為Java后續(xù)課程的學(xué)習(xí)打下堅(jiān)實(shí)的基礎(chǔ)。 課程的主要內(nèi)容如下: 1、緒論 2、Java程序設(shè)計(jì)基礎(chǔ) 3、Java面向?qū)ο蟪绦蛟O(shè)計(jì) 4、數(shù)組、字符串、向量和哈希表 5、泛型、枚舉與for語句的簡(jiǎn)化寫法 6、Java異常處理與遞歸 7、文件與數(shù)據(jù)流 8、Java圖形用戶界面程序設(shè)計(jì) 9、多線程程序設(shè)計(jì) 10、網(wǎng)絡(luò)程序設(shè)計(jì) 第1章 緒論 一、教學(xué)目的和要求 了解Java語言的發(fā)展歷史,Java語言的特點(diǎn),學(xué)會(huì)安裝配置Java開發(fā)環(huán)境,能夠編譯和運(yùn)行Java程序。 二、講授的內(nèi)容提要和重點(diǎn)、難點(diǎn)及其解決方法,學(xué)時(shí)分配 1、教學(xué)內(nèi)容 Java語言的發(fā)展歷史 Java語言的特點(diǎn) Java開發(fā)環(huán)境的安裝與配置 Java程序開發(fā)過程以及命令行狀態(tài)下編譯與運(yùn)行過程介紹 2、教學(xué)重點(diǎn) Java語言的特點(diǎn),開發(fā)環(huán)境配置,編譯運(yùn)行方法 3、教學(xué)難點(diǎn) 理解Java程序?yàn)槭裁茨軌蛞淮尉幾g到處運(yùn)行;為什么要配置Path環(huán)境變量;編譯與運(yùn)行的注意事項(xiàng)。 4、解決辦法 原理講解,操作演示 5、學(xué)時(shí)分配 發(fā)展歷史:0.5課時(shí) Java語言的特點(diǎn):0.5課時(shí) Java開發(fā)環(huán)境的安裝與配置:0.5課時(shí) Java程序開發(fā)過程以及命令行狀態(tài)下編譯與運(yùn)行過程介紹:0.5課時(shí) 三、教學(xué)過程(教學(xué)方法、實(shí)施步驟) 使用PPT講解,運(yùn)行環(huán)境配置,編譯運(yùn)行Java程序則現(xiàn)場(chǎng)操作演示。 四、課外學(xué)習(xí)要求和作業(yè)要求 課外作業(yè):要求下載JDK,自行安裝配置并編譯運(yùn)行HelloWorld.java程序 第2章 Java程序設(shè)計(jì)基礎(chǔ) 一、教學(xué)目的和要求 了解Java中數(shù)據(jù)的類型,表示方法,變量的聲明,掌握使用標(biāo)識(shí)符命名Java中各種成分的規(guī)定和規(guī)范;正確掌握表達(dá)式的書寫方法;能夠使用各種控制結(jié)構(gòu)實(shí)現(xiàn)程序的邏輯;掌握結(jié)構(gòu)化程序設(shè)計(jì)的思想和算法描述工具的使用。 二、講授的內(nèi)容提要和重點(diǎn)、難點(diǎn)及其解決方法,學(xué)時(shí)分配 1、教學(xué)內(nèi)容 標(biāo)識(shí)符和關(guān)鍵字 基本數(shù)據(jù)類型 常量和變量 數(shù)據(jù)類型轉(zhuǎn)換 運(yùn)算符:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、布爾邏輯運(yùn)算符、位運(yùn)算符、賦值類運(yùn)算符、條件運(yùn)算符等 表達(dá)式 程序流程控制語句:if和switch語句;for、while、do~while循環(huán)語句;break、Continue和return語句 結(jié)構(gòu)化程序設(shè)計(jì) 2、教學(xué)重點(diǎn) 基本數(shù)據(jù)類型和類型轉(zhuǎn)換,常量和變量,運(yùn)算符與表達(dá)式,程序流程控制語句。 3、教學(xué)難點(diǎn) 數(shù)據(jù)類型轉(zhuǎn)換;前綴自增、自減運(yùn)算符與后綴自增、自減運(yùn)算符的區(qū)別;程序流程控制語句。分支語句的嵌套;循環(huán)語句的嵌套;標(biāo)號(hào)的概念與使用。 4、解決辦法 原理講解,操作演示 5、學(xué)時(shí)分配 標(biāo)識(shí)符和關(guān)鍵字,基本數(shù)據(jù)類型,常量和變量:2學(xué)時(shí) 數(shù)據(jù)類型轉(zhuǎn)換,運(yùn)算符,表達(dá)式:1學(xué)時(shí) 程序流程控制語句,break、Continue和return語句:2學(xué)時(shí) 結(jié)構(gòu)化程序設(shè)計(jì):1學(xué)時(shí) 三、教學(xué)過程(教學(xué)方法、實(shí)施步驟) 使用PPT講解,對(duì)每一個(gè)編程知識(shí)點(diǎn)編寫Java程序進(jìn)行運(yùn)行演示。 四、課外學(xué)習(xí)要求和作業(yè)要求 課外作業(yè):要求復(fù)習(xí)課堂教學(xué)內(nèi)容,對(duì)主要知識(shí)點(diǎn)布置作業(yè),要求編寫程序并條試運(yùn)行。要求學(xué)會(huì)使用算法描述工具表示和設(shè)計(jì)程序的算法。 第3章 面向?qū)ο蟪绦蛟O(shè)計(jì) 一、教學(xué)目的和要求 了解面向?qū)ο蟪绦蛟O(shè)計(jì)基本思想,掌握類的設(shè)計(jì)方法、實(shí)例對(duì)象的創(chuàng)建與使用。了解變量作用域范圍與參數(shù)傳遞方式。了解并能運(yùn)用Java中面向?qū)ο蟮姆庋b性、繼承性、多態(tài)性; 掌握訪問權(quán)限的控制方法,修飾詞abstract、static和final的使用;掌握包、抽象類、接口、內(nèi)部類的概念和使用方法。 二、講授的內(nèi)容提要和重點(diǎn)、難點(diǎn)及其解決方法,學(xué)時(shí)分配 1、教學(xué)內(nèi)容 類和對(duì)象的基本概念。面向?qū)ο蟪绦蛟O(shè)計(jì)基本思想。 類的設(shè)計(jì)、構(gòu)造方法、類的成員變量和成員方法。實(shí)例對(duì)象的創(chuàng)建與使用。 變量作用域范圍與參數(shù)傳遞方式。繼承性。 多態(tài)性:靜態(tài)多態(tài)性和動(dòng)態(tài)多態(tài)性。封裝性和訪問權(quán)限控制。 修飾詞abstract、static和final。包的概念和使用 抽象類和接口。內(nèi)部類。 2、教學(xué)重點(diǎn) 類的定義,對(duì)象的創(chuàng)建,構(gòu)造方法的定義與使用,方法的重載與覆蓋,類的繼承,包,抽象類和接口。 3、教學(xué)難點(diǎn) 類與對(duì)象的概念、創(chuàng)建和使用;方法重載的規(guī)則;類的繼承與運(yùn)行時(shí)多態(tài),類繼承時(shí)對(duì)構(gòu)造方法的處理問題,訪問控制權(quán)限的使用;方法覆蓋的規(guī)則;抽象類的應(yīng)用,接口的應(yīng)用;抽象類與接口的異同。 4、解決辦法 原理講解,操作演示 5、學(xué)時(shí)分配 類和對(duì)象的基本概念,面向?qū)ο蟪绦蛟O(shè)計(jì)基本思想:2學(xué)時(shí) 類的設(shè)計(jì)、構(gòu)造方法、類的成員變量和成員方法,實(shí)例對(duì)象的創(chuàng)建與使用,變量作用域范圍與參數(shù)傳遞方式:2學(xué)時(shí) 繼承性,方法覆蓋,多態(tài)性:靜態(tài)多態(tài)性和動(dòng)態(tài)多態(tài)性:2學(xué)時(shí) 封裝性和訪問權(quán)限控制,修飾詞abstract、static和final,包的概念和使用:2學(xué)時(shí) 抽象類和接口,內(nèi)部類:2學(xué)時(shí) 三、教學(xué)過程(教學(xué)方法、實(shí)施步驟) 使用PPT講解,對(duì)每一個(gè)編程知識(shí)點(diǎn)編寫Java程序進(jìn)行運(yùn)行演示。 四、課外學(xué)習(xí)要求和作業(yè)要求 課外作業(yè):要求復(fù)習(xí)課堂教學(xué)內(nèi)容,對(duì)主要知識(shí)點(diǎn)布置作業(yè),要求編寫程序并條試運(yùn)行。安排4個(gè)學(xué)時(shí)的課內(nèi)上機(jī)實(shí)驗(yàn)。 第4章 數(shù)組、字符串、向量與哈希表 一、教學(xué)目的和要求 了解一維數(shù)據(jù)和多維數(shù)組的聲明與使用,掌握遍歷數(shù)組的方法,了解并能夠使用字符串String的常用方法,掌握StringBuffer的用法,了解并掌握向量Vector,哈希表Hashtable、HashMap和WeakHashMap的用法。 二、講授的內(nèi)容提要和重點(diǎn)、難點(diǎn)及其解決方法,學(xué)時(shí)分配 1、教學(xué)內(nèi)容 數(shù)組:一維數(shù)據(jù)和多維數(shù)組。字符串:String和StringBuffer。向量:Vector。 哈希表:Hashtable、HashMap和WeakHashMap。 2、教學(xué)重點(diǎn) 一維數(shù)組的使用,String和StringBuffer的構(gòu)造方法和常見方法的使用,Vector類的使用,哈希表類的創(chuàng)建和使用。 3、教學(xué)難點(diǎn) 多維數(shù)組的聲明和使用,數(shù)組的初始化方法,String和StringBuffer的使用方法的區(qū)別,哈希表類的使用。 4、解決辦法 原理講解,操作演示 5、學(xué)時(shí)分配 數(shù)組:一維數(shù)據(jù)和多維數(shù)組:1.5學(xué)時(shí) 字符串:String和StringBuffer:1學(xué)時(shí) 向量:Vector,哈希表:1.5學(xué)時(shí) 三、教學(xué)過程(教學(xué)方法、實(shí)施步驟) 使用PPT講解,對(duì)每一個(gè)編程知識(shí)點(diǎn)編寫Java程序進(jìn)行運(yùn)行演示。 四、課外學(xué)習(xí)要求和作業(yè)要求 課外作業(yè):要求復(fù)習(xí)課堂教學(xué)內(nèi)容,對(duì)主要知識(shí)點(diǎn)布置作業(yè),要求編寫程序并條試運(yùn)行。要求作業(yè)必須進(jìn)行上機(jī)調(diào)試。 第5章 異常處理 一、教學(xué)目的和要求 了解異常的概念,異常類的層次結(jié)構(gòu);掌握異常的拋出、捕獲和處理方法;能夠自定義異常類并且使用自定義異常類。 二、講授的內(nèi)容提要和重點(diǎn)、難點(diǎn)及其解決方法,學(xué)時(shí)分配 1、教學(xué)內(nèi)容 異常的概念。異常類的層次結(jié)構(gòu)。異常的拋出、捕獲和處理。自定義異常類 2、教學(xué)重點(diǎn) 異常的基本概念,異常的拋出捕獲和處理,自定義異常類。 3、教學(xué)難點(diǎn) 異常的處理機(jī)制;Try-catch-finallly異常處理結(jié)構(gòu)的執(zhí)行流程特點(diǎn);自定義異常類。 4、解決辦法 原理講解,操作演示 5、學(xué)時(shí)分配 異常的概念,異常類的層次結(jié)構(gòu):0.5學(xué)時(shí) 異常的拋出、捕獲和處理:1學(xué)時(shí) 自定義異常類:0.5學(xué)時(shí) 三、教學(xué)過程(教學(xué)方法、實(shí)施步驟) 使用PPT講解,對(duì)每一個(gè)編程知識(shí)點(diǎn)編寫Java程序進(jìn)行運(yùn)行演示。 四、課外學(xué)習(xí)要求和作業(yè)要求 課外作業(yè):要求復(fù)習(xí)課堂教學(xué)內(nèi)容,對(duì)主要知識(shí)點(diǎn)布置作業(yè),要求編寫程序并條試運(yùn)行。安排一次課內(nèi)上機(jī)實(shí)驗(yàn)。 第6章 文件與數(shù)據(jù)流 一、教學(xué)目的和要求 了解輸入流與輸出流的基本概念,掌握常見輸入和輸出流類的使用,掌握文件和隨機(jī)存取文件的操作,了解讀寫器的使用方法,掌握對(duì)象序列化的概念。能夠編寫從鍵盤輸入數(shù)據(jù)以及對(duì)磁盤文件進(jìn)行讀寫的程序 二、講授的內(nèi)容提要和重點(diǎn)、難點(diǎn)及其解決方法,學(xué)時(shí)分配 1、教學(xué)內(nèi)容 輸入流與輸出流的基本概念。 常見輸入和輸出流類:InputStream和OutputStream,DataInputStream和DataOutputStream,F(xiàn)ileInputStream和FileOutputStream,PrintStream, 帶緩存的輸入流和輸出流。文件和隨機(jī)存取文件。 讀寫器:Reader和Writer,F(xiàn)ileReader和FileWriter,帶緩存的讀寫器,PrintWriter。 對(duì)象序列化。 2、教學(xué)重點(diǎn) 輸入輸出流的基本概念,文件輸入流和文件輸出流,文件與目錄管理,隨機(jī)存取文件。 3、教學(xué)難點(diǎn) 字節(jié)流與字符流的選用,節(jié)點(diǎn)流與過濾流的配合使用,隨機(jī)讀寫文件,對(duì)象序列化。 4、解決辦法 原理講解,操作演示 5、學(xué)時(shí)分配 輸入流與輸出流的基本概念,常見輸入和輸出流類的使用,過濾流的使用:2學(xué)時(shí) 文件和隨機(jī)存取文件,讀寫器:Reader和Writer,F(xiàn)ileReader和FileWriter,帶緩存的讀寫器,PrintWriter,對(duì)象序列化:2學(xué)時(shí) 三、教學(xué)過程(教學(xué)方法、實(shí)施步驟) 使用PPT講解,對(duì)每一個(gè)編程知識(shí)點(diǎn)編寫Java程序進(jìn)行運(yùn)行演示。 四、課外學(xué)習(xí)要求和作業(yè)要求 課外作業(yè):要求復(fù)習(xí)課堂教學(xué)內(nèi)容,對(duì)主要知識(shí)點(diǎn)布置作業(yè),要求編寫程序并條試運(yùn)行。安排一次課內(nèi)上機(jī)實(shí)驗(yàn)。 第7章 圖形用戶界面程序設(shè)計(jì) 一、教學(xué)目的和要求 了解基本組件和容器組件,掌握主要布局管理器的概念和使用方法,掌握事件處理機(jī)制及其實(shí)現(xiàn)方法,了解Swing的特點(diǎn)和類的層次結(jié)構(gòu),Swing常見組件和容器;掌握鍵盤和鼠標(biāo)事件處理方法,了解高級(jí)圖形用戶界面:菜單、樹、表格和多文檔界面的編程方法;掌握J(rèn)ava的圖形程序設(shè)計(jì)。 二、講授的內(nèi)容提要和重點(diǎn)、難點(diǎn)及其解決方法,學(xué)時(shí)分配 1、教學(xué)內(nèi)容 AWT功能和類的層次結(jié)構(gòu)。(選講)AWT的基本組件和容器組件。(選講)布局管理器。事件處理機(jī)制。 Swing的特點(diǎn)和類的層次結(jié)構(gòu)。Swing常見組件和容器。鍵盤和鼠標(biāo)事件處理。 高級(jí)圖形用戶界面:菜單、樹、表格和多文檔界面。 小應(yīng)用程序:Applet的基本工作原理, Applet生命周期, Applet類中的重要方法, Applet編寫方法和Applet與瀏覽器的參數(shù)傳遞。(選講)Java的圖形程序設(shè)計(jì)。 2、教學(xué)重點(diǎn) 常用的GUI組件和容器,布局管理器,事件處理機(jī)制,菜單和表格。 3、教學(xué)難點(diǎn): 布局管理器的靈活應(yīng)用,事件處理機(jī)制,表格處理。 4、解決辦法 原理講解,操作演示 5、學(xué)時(shí)分配 常用圖形控件,基本組件和容器組件,布局管理器:2學(xué)時(shí) 事件處理機(jī)制:2學(xué)時(shí) Swing的特點(diǎn)和類的層次結(jié)構(gòu),Swing常見組件和容器:2學(xué)時(shí) 鍵盤和鼠標(biāo)事件處理:2學(xué)時(shí) 高級(jí)圖形用戶界面:菜單、樹、表格和多文檔界面:2學(xué)時(shí) 小應(yīng)用程序:Applet的基本工作原理, Applet生命周期, Applet類中的重要方法, Applet編寫方法和Applet與瀏覽器的參數(shù)傳遞。:2學(xué)時(shí) Java的圖形程序設(shè)計(jì):2學(xué)時(shí) 三、教學(xué)過程(教學(xué)方法、實(shí)施步驟) 使用PPT講解,對(duì)每一個(gè)編程知識(shí)點(diǎn)編寫Java程序進(jìn)行運(yùn)行演示。 四、課外學(xué)習(xí)要求和作業(yè)要求 課外作業(yè):要求復(fù)習(xí)課堂教學(xué)內(nèi)容,對(duì)主要知識(shí)點(diǎn)布置作業(yè),要求編寫程序并條試運(yùn)行。安排4學(xué)時(shí)課內(nèi)上機(jī)實(shí)驗(yàn)。 第8章 多線程程序設(shè)計(jì) 一、教學(xué)目的和要求 了解基本組件和容器組件,掌握主要布局管理器的概念和使用方法,掌握事件處理機(jī)制及其實(shí)現(xiàn)方法,了解Swing的特點(diǎn)和類的層次結(jié)構(gòu),Swing常見組件和容器;掌握鍵盤和鼠標(biāo)事件處理方法,了解高級(jí)圖形用戶界面:菜單、樹、表格和多文檔界面的編程方法;掌握J(rèn)ava的圖形程序設(shè)計(jì)。 二、講授的內(nèi)容提要和重點(diǎn)、難點(diǎn)及其解決方法,學(xué)時(shí)分配 1、教學(xué)內(nèi)容 程序、進(jìn)程、線程的概念。線程的創(chuàng)建。 線程的狀態(tài)與線程的控制。線程優(yōu)先級(jí)與線程調(diào)度。多線程的同步問題和處理方法。 2、教學(xué)重點(diǎn) 線程的創(chuàng)建、線程的控制與調(diào)度,多線程同步問題。 3、教學(xué)難點(diǎn) 兩種創(chuàng)建線程的方法的區(qū)別,啟動(dòng)線程的start()方法與直接調(diào)用run()方法的區(qū)別,多線程同步問題和處理方法。 4、解決辦法 原理講解,操作演示 5、學(xué)時(shí)分配 程序、進(jìn)程、線程的概念,線程的創(chuàng)建,線程的狀態(tài)與線程的控制:2學(xué)時(shí) 線程優(yōu)先級(jí)與線程調(diào)度,多線程的同步問題和處理方法:2學(xué)時(shí) 三、教學(xué)過程(教學(xué)方法、實(shí)施步驟) 使用PPT講解,對(duì)每一個(gè)編程知識(shí)點(diǎn)編寫Java程序進(jìn)行運(yùn)行演示。 四、課外學(xué)習(xí)要求和作業(yè)要求 課外作業(yè):要求復(fù)習(xí)課堂教學(xué)內(nèi)容,對(duì)主要知識(shí)點(diǎn)布置作業(yè),要求編寫程序并條試運(yùn)行。安排2學(xué)時(shí)課內(nèi)上機(jī)實(shí)驗(yàn)。第9章 網(wǎng)絡(luò)程序設(shè)計(jì) 一、教學(xué)目的和要求 了解基本組件和容器組件,掌握主要布局管理器的概念和使用方法,掌握事件處理機(jī)制及其實(shí)現(xiàn)方法,了解Swing的特點(diǎn)和類的層次結(jié)構(gòu),Swing常見組件和容器;掌握鍵盤和鼠標(biāo)事件處理方法,了解高級(jí)圖形用戶界面:菜單、樹、表格和多文檔界面的編程方法;掌握J(rèn)ava的圖形程序設(shè)計(jì)。 二、講授的內(nèi)容提要和重點(diǎn)、難點(diǎn)及其解決方法,學(xué)時(shí)分配 1、教學(xué)內(nèi)容 基于URL獲取網(wǎng)絡(luò)資源 基于TCP的網(wǎng)絡(luò)程序設(shè)計(jì) 基于UDP的網(wǎng)絡(luò)程序設(shè)計(jì) 2、教學(xué)重點(diǎn) 基于URL獲取網(wǎng)絡(luò)資源,基于TCP的網(wǎng)絡(luò)程序設(shè)計(jì)。 3、教學(xué)難點(diǎn) 支持多客戶端/服務(wù)器端程序的設(shè)計(jì)與開發(fā)。 4、解決辦法 原理講解,操作演示 5、學(xué)時(shí)分配 基于URL獲取網(wǎng)絡(luò)資源:1學(xué)時(shí) 基于TCP的網(wǎng)絡(luò)程序設(shè)計(jì):1.5學(xué)時(shí) 基于UDP的網(wǎng)絡(luò)程序設(shè)計(jì):1.5學(xué)時(shí) 三、教學(xué)過程(教學(xué)方法、實(shí)施步驟)使用PPT講解,對(duì)每一個(gè)編程知識(shí)點(diǎn)編寫Java程序進(jìn)行運(yùn)行演示。 四、課外學(xué)習(xí)要求和作業(yè)要求 課外作業(yè):要求復(fù)習(xí)課堂教學(xué)內(nèi)容,對(duì)主要知識(shí)點(diǎn)布置作業(yè),要求編寫程序并條試運(yùn)行。 武漢大學(xué)珞珈學(xué)院 系/教研室 Java 面 向 對(duì) 象 程 序 設(shè) 計(jì) 課 教 案 主講教師:熊春秀 編寫時(shí)間:2011-4-30 第一章:概述 第 1、2 節(jié):面向?qū)ο蟮幕靖拍?、面向?qū)ο蟪绦蛟O(shè)計(jì)概述 授課時(shí)間:2011-2- 22、23 計(jì)劃學(xué)時(shí)數(shù):1 教學(xué)任務(wù)與目的:讓學(xué)生理解面向?qū)ο蟮幕靖拍?教學(xué)重點(diǎn):掌握面向?qū)ο蟮幕靖拍?教學(xué)難點(diǎn):理解面向?qū)ο蟪绦蛟O(shè)計(jì)的方法 教學(xué)方法:多媒體+板書 參考書目:《面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》,[美]C.Thomas wu著,電子工業(yè)出版社 專業(yè)詞匯:Java虛擬機(jī)、Applet程序 備注 第二章:Java特點(diǎn)及運(yùn)行環(huán)境 第 1、2、3 節(jié):Java語言特點(diǎn)、Java應(yīng)用程序及運(yùn)行環(huán)境、Java Applet程序及運(yùn)行環(huán)境 授課時(shí)間:2011-2- 22、23 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)JDK的下載、安裝與環(huán)境配置。教學(xué)重點(diǎn):掌握編譯和執(zhí)行Java程序的基本步驟 教學(xué)難點(diǎn):理解Java程序的入口并能夠通過命令行傳遞參數(shù) 教學(xué)方法:多媒體+板書 參考書目:《面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》,[美]C.Thomas wu著,電子工業(yè)出版社 專業(yè)詞匯:JDK、lib、bin 備注 第三章:Java語言基礎(chǔ) 第 1、2 節(jié):Java程序的構(gòu)成、數(shù)據(jù)類型、表達(dá)式以及流程控制語句 授課時(shí)間:2011-3- 1、2 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)Java基本的數(shù)據(jù)類型和表示方法、數(shù)值類型的運(yùn)算、邏輯運(yùn)算和比較、條件執(zhí)行語句(包括三種條件語句和switch語句)、循環(huán)控制語句(包括for、while、do while循環(huán)及相應(yīng)的輔助語句)、字符串類String和BufferString以及數(shù)組的聲明及使用。 教學(xué)重點(diǎn):掌握J(rèn)ava基本的數(shù)據(jù)類型和表示方法 教學(xué)難點(diǎn):理解Java程序的循環(huán)控制語句(包括for、while、do while循環(huán)及相應(yīng)的輔助語句) 教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社 專業(yè)詞匯:變量、數(shù)據(jù)類型、循環(huán)控制語句 備注 第三章:Java語言基礎(chǔ) 第 3 節(jié):Java與C比較 授課時(shí)間:2011-3- 8、9 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生在C語言的基本上進(jìn)一步學(xué)習(xí)Java語言。教學(xué)重點(diǎn):掌握J(rèn)ava語言與C語言的區(qū)別與聯(lián)系。教學(xué)難點(diǎn):理解Java語言在C語言上的改進(jìn)。教學(xué)方法:多媒體+板書 參考書目:《Java2參考大全(第四版)》,[美]Herbert Schildt著,張玉清、吳浦峰、尚勇等譯,清華大學(xué)出版社。專業(yè)詞匯:Java、C 備注 第四章:抽象、封裝與類 第 1 節(jié):抽象、封裝與Java類的概念 授課時(shí)間:2011-3- 15、16 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)面向?qū)ο蟮幕咎卣?、掌握如何定義一個(gè)類以及如何生成對(duì)象、深入掌握方法的定義及技巧、深入掌握類的訪問權(quán)限與封裝機(jī)制、深入掌握包的定義與包的使用方法。 教學(xué)重點(diǎn):掌握類的定義與對(duì)象的生成。教學(xué)難點(diǎn):理解類的抽象與封裝機(jī)制。教學(xué)方法:多媒體+板書 參考書目:《Java2 實(shí)用教程》,耿祥義、張躍平編著,清華大學(xué)出版社。專業(yè)詞匯:抽象、封裝、類 備注 第四章:抽象、封裝與類 第 2 節(jié):系統(tǒng)定義的類 授課時(shí)間:2011-3- 22、23 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)使用系統(tǒng)定義的類,并掌握與用戶自定義類的區(qū)別。教學(xué)重點(diǎn):掌握如何定義所需要的類。 教學(xué)難點(diǎn):熟悉Java平臺(tái)定義了哪些經(jīng)常要用到、而且滿足我們需要的類。教學(xué)方法:多媒體+板書 參考書目:《Java2 實(shí)用教程》,耿祥義、張躍平編著,清華大學(xué)出版社。專業(yè)詞匯:系統(tǒng)定義的類、用戶自定義類 備注 第四章:抽象、封裝與類 第 3 節(jié):類、域和方法的修飾符 授課時(shí)間:2011-3- 29、30 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)類的聲明。 教學(xué)重點(diǎn):掌握如何定義類的修飾和方法的修飾符。教學(xué)難點(diǎn):熟悉類的變量的定義與使用方法。教學(xué)方法:多媒體+板書 參考書目:《Java2 實(shí)用教程》,耿祥義、張躍平編著,清華大學(xué)出版社。專業(yè)詞匯:成員變量、類變量、成員方法、類方法 備注 第五章:繼承與多態(tài) 第 1、2 節(jié):Java的繼承與派生、域的繼承與隱藏 授課時(shí)間:2011-4- 5、6 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生全面掌握面向?qū)ο蟮幕咎卣鳌⒄莆杖绾问褂美^承性來到達(dá)軟件的重用、深入掌握繼承過程中域的隱藏和方法的覆蓋技巧。教學(xué)重點(diǎn):掌握如何使用繼承性來到達(dá)軟件的重用。教學(xué)難點(diǎn):熟悉繼承過程中域的隱藏和方法的覆蓋技巧。教學(xué)方法:多媒體+板書 參考書目:《Java2 實(shí)用教程》,耿祥義、張躍平編著,清華大學(xué)出版社。專業(yè)詞匯:繼承派生、域、隱藏 備注 第五章:繼承與多態(tài) 第 3、4 節(jié):方法的繼承、重載與覆蓋、this與super、構(gòu)造函數(shù)的繼承與重載 授課時(shí)間:2011-4- 12、13 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生通過繼承可以更有效地組織程序結(jié)構(gòu),明確類之間的關(guān)系,并充分利用已有的類來創(chuàng)建新類,通過繼承可以實(shí)現(xiàn)代碼的重用,以完成更復(fù)雜的設(shè)計(jì)、開發(fā)。教學(xué)重點(diǎn):掌握類的重載與覆蓋的區(qū)別與聯(lián)系。教學(xué)難點(diǎn):熟悉類的重載與覆蓋使用方法。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:繼承、重載、覆蓋、this、super 備注 第五章:繼承與多態(tài) 第 5、6 節(jié):多態(tài)性的實(shí)現(xiàn)、接口聲明與實(shí)現(xiàn) 授課時(shí)間:2011-4- 19、20 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生深入掌握抽象類和抽象方法的定義,掌握多態(tài)通過統(tǒng)一多個(gè)相關(guān)類的對(duì)外接口,在運(yùn)行時(shí)根據(jù)不同的情況執(zhí)行不同的操作,提高類的抽象度和靈活性,深入掌握接口的定義和使用技巧。 教學(xué)重點(diǎn):熟悉多態(tài)性實(shí)現(xiàn)的兩種方式以及接口的實(shí)現(xiàn)。教學(xué)難點(diǎn):熟悉多態(tài)性與接口的實(shí)現(xiàn)方法。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:多態(tài)性、接口 備注 第六章:工具類與算法 第 1、2 節(jié):語言基礎(chǔ)類庫、Applet類與小程序的基本原理 授課時(shí)間:2011-4- 26、27 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:深入了解Applet生命周期的主要方法和特點(diǎn)、熟練掌握Applet程序的編寫方法、深入了解Applet的安全機(jī)制及其合理運(yùn)用。教學(xué)重點(diǎn):熟練掌握Applet程序的編寫方法。 教學(xué)難點(diǎn):深入了解Applet的安全機(jī)制及其合理運(yùn)用。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:Applet、生命周期 備注 第六章:工具類與算法 第 3、4 節(jié):數(shù)組、字符串、常用算法 授課時(shí)間:2011-5- 3、4 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)字符串類String和BufferString、數(shù)組的聲明及使用。教學(xué)重點(diǎn):熟練掌握字符串與數(shù)組的使用方法。教學(xué)難點(diǎn):深入了解數(shù)組的使用方法。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:數(shù)組、字符串 備注 第七章:用戶圖形界面的設(shè)計(jì) 第 1、2 節(jié):用戶自定義成分、事件驅(qū)動(dòng)設(shè)計(jì) 授課時(shí)間:2011-5- 10、11 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)使用面向?qū)ο蟮某绦蛟O(shè)計(jì)方法構(gòu)建圖形用戶界面、深入了解抽象窗口工具包(AWT)、掌握事件處理基本原理和方法。教學(xué)重點(diǎn):熟練掌握?qǐng)D形用戶界面的開發(fā)方法。教學(xué)難點(diǎn):深入了解圖形界面的各種事件。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:AWT、GUI 備注 第七章:用戶圖形界面的設(shè)計(jì) 第 3、4 節(jié):GUI對(duì)象,包括:按鈕、文本框、鼠標(biāo)、鍵盤等事件的處理、布局設(shè)計(jì) 授課時(shí)間:2011-5- 17、18 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生深入了解GUI構(gòu)件及掌握布局控制方法、熟練掌握菜單和對(duì)話框、掌握簡(jiǎn)單繪圖方法。 教學(xué)重點(diǎn):熟練使用Java語言提供的布局管理器來管理組件在容器中的布局。教學(xué)難點(diǎn):深入了解組件在程序中安排中位置和大小使用方法。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:布局管理器、容器 備注 第八章:Java高級(jí)編程 第 1、2、3節(jié):異常處理、多線程機(jī)制、Java程序?qū)W(wǎng)上資源的訪問 授課時(shí)間:2011-5- 24、25 計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生深入理解多線程的基本概念、熟練掌握創(chuàng)建線程的兩種基本方法、熟練處理線程的同步問題和死鎖問題、深入理解異常的基本概念、熟悉和掌握J(rèn)ava平臺(tái)定義異常類、熟練掌握創(chuàng)建自定義異常類的方法。教學(xué)重點(diǎn):熟練掌握創(chuàng)建線程的兩種基本方法。教學(xué)難點(diǎn):深入了解線程的同步問題和死鎖問題。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:同步、死鎖、多線程、異常第二篇:java程序設(shè)計(jì)教案
第三篇:Java程序設(shè)計(jì)教案
第四篇:Java程序設(shè)計(jì)課程教案
第五篇:java面向?qū)ο蟪绦蛟O(shè)計(jì)教案