# Java 程式設計課程 **目錄**: [TOC] ## CH0 ### Hello Java! ```java= public class A0 { public static void main(String A[]) { System.out.println("Hello Java!"); } } ``` Output Hello Java! ## CH1 ### 資料型態 * 基本資料型態 | 資料型態|名稱| 記憶體| 資料型態|名稱| 記憶體| | -------- | -------- | -------- |-------- | -------- | -------- | | 字元 |char|2 |浮點數 |float|4 | | 整數|byte|1 |浮點數|double|8 | | 整數|short|2 |布林 |boolean|1 | | 整數|int|4 | | 整數|long|8| * 參考資料型態 | 資料型態|名稱| | -------- | -------- | |字串|String| |陣列|Array| |物件|Object| ```java= public class A1_1 { public static void main(String A[]) { char c1='Z',c2=97; //字元 System.out.println("c1="+c1+" c2="+c2); int i1=5,i2='A',i3=(int)2.5; //整數 System.out.println("i1="+i1+" i2="+i2+" i3="+i3); float f1=5,f2='W',f3=2.5f; //浮點數 System.out.println("f1="+f1+" f2="+f2+" f3="+f3); double d1=2.5,d2='a',d3=5; //浮點數 System.out.println("d1="+d1+" d2="+d2+" d3="+d3); boolean b1=true,b2=false; //布林 System.out.println("b1="+b1+" b2="+b2); } } ``` Output c1=Z c2=a i1=5 i2=65 i3=2 f1=5.0 f2=87.0 f3=2.5 d1=2.5 d2=97.0 d3=5.0 b1=true b2=false ### 溢位事件 |資料型態|範圍 | | -------- | -------- | |byte|-128 ~ 127| |short|-32768 ~ 32767| |int|-2147483648 ~2147483647| |long|-9223372036854775808 ~9223372036854775807| ```java= import java.lang.*; public class A1_2 { public static void main (String A[]) { int imax = java.lang.Integer.MAX_VALUE; int imin = java.lang.Integer.MIN_VALUE; System.out.println("imin="+imin+" imax="+imax); System.out.println("溢位發生,imin-1="+(imin-1)+" imax+1="+(imax+1)); //int+int -->int System.out.println("錯誤處理,(long)imin-1="+(long)(imin-1)+" (long)imax+1="+(long)(imax+1)); //int+int -->(long)int System.out.println("正確處理,((long)imin-1)="+((long)imin-1)+" ((long)imax+1)="+((long)imax+1)); //(long)int+int -->long } } ``` Output imin=-2147483648 imax=2147483647 溢位發生,imin-1=2147483647 imax+1=-2147483648 錯誤處理,(long)imin-1=2147483647 (long)imax+1=-2147483648 正確處理,((long)imin-1)=-2147483649 ((long)imax+1)=2147483648 ## CH2 ### 基本輸入、輸出 輸入: String 變數名稱=br.readLine(); //輸入訊息存入變數(字串型態) 輸出: System.out.print("字串"); //輸出後不換行 System.out.println("字串"); //輸出後換行 ```java= import java.io.*; public class A2_1 { public static void main (String A[])throws IOException //丟擲異常 { InputStreamReader isr=new InputStreamReader(System.in); //是位元組流通向字元流的橋樑 BufferedReader br=new BufferedReader(isr); //緩衝區 System.out.print("1.請輸入姓名: "); String name=br.readLine(); System.out.print("2.請輸入國文成績: "); String s1=br.readLine(); System.out.print("3.請輸入英文成績: "); String s2=br.readLine(); System.out.print("4.請輸入數學成績: "); String s3=br.readLine(); System.out.println("-------------------------"); System.out.println("姓名:"+ name); System.out.println("國文:"+ s1+"\n英文:"+ s2+"\n數學:"+ s3); System.out.println("總分:"+ (Integer.parseInt(s1)+Integer.parseInt(s2)+Integer.parseInt(s3))); //將s1,s2,s3(String)強制轉型成整數(int)型態 System.out.println("平均:"+ (Integer.parseInt(s1)+Integer.parseInt(s2)+Integer.parseInt(s3))/3); } } ``` Output 1.請輸入姓名: Lin 2.請輸入國文成績: 90 3.請輸入英文成績: 80 4.請輸入數學成績: 70 ------------------------- 姓名:Lin 國文:90 英文:80 數學:70 總分:240 平均:80 ### 加、減法運算 * 四則運算: | 四則運算 | 算數運算子 | | -------- | ---------- | | 加法 | + | | 減法 | - | | 乘法 | * | | 除法 | / | | 取餘數 | % | ```java= import java.io.*; public class A2_2 { public static void main (String A[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.print("1.請輸入a: "); String s1=br.readLine(); int a=Integer.parseInt(s1); //將s1強制轉型成整數(int)後,存入變數a System.out.print("2.請輸入b: "); String s2=br.readLine(); int b=Integer.parseInt(s2); //將s2強制轉型成整數(int)後,存入變數b System.out.println("a++="+(a++)+" a="+a); //a++ 是先輸出後+1 System.out.println("++b="+(++b)+" b="+b); //++b 是先+1後輸出 System.out.println("a+=b:"+(a+=b)+" a="+a+" b="+b); //a=a+b System.out.println("a+=b--:"+(a+=b--)+" a="+a+" b="+b); //a=a+b,b=b-1 System.out.println("a+=--b:"+(a+=--b)+" a="+a+" b="+b); //b=b-1,a=+1 } } ``` Output 1.請輸入a: 1 2.請輸入b: 1 a++=1 a=2 ++b=2 b=2 a+=b:4 a=4 b=2 a+=b--:6 a=6 b=1 a+=--b:6 a=6 b=0 ### [練習]:成績計算 輸入說明: 依序輸入姓名、國文成績、英文成績、數學成績 輸出說明: 輸出三科成績並計算出該生的總分和平均 ```java= import java.io.*; public class A2_3 { public static void main (String A[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.print("1.請輸入姓名:"); String name=br.readLine(); System.out.print("2.請輸入國文成績:"); String s1=br.readLine(); int n1=Integer.parseInt(s1); System.out.print("3.請輸入英文成績:"); String s2=br.readLine(); int n2=Integer.parseInt(s2); System.out.print("4.請輸入數學成績"); String s3=br.readLine(); int n3=Integer.parseInt(s3); int sum=n1+n2+n3; //計算總分 double avg=(n1+n2+n3)/3.0; //計算平均 int+double --> double System.out.println("-------------------------"); System.out.println("姓名:"+ name); System.out.println("國文:"+ s1+"\n英文:"+ s2+"\n數學:"+ s3); System.out.println("總分:"+ sum); System.out.println("平均"+ avg); } } ``` Output 1.請輸入姓名:Lin 2.請輸入國文成績:90 3.請輸入英文成績:80 4.請輸入數學成績70 ------------------------- 姓名:Lin 國文:90 英文:80 數學:70 總分:240 平均80.0 ## CH3 ### if 語法 if(判斷條件){ 條件成立時,執行內容 } if(判斷條件){ 條件成立時,執行內容 } . . . if(判斷條件){ 條件成立時,執行內容 } ```java= import java.io.*; public class A3_1 { public static void main (String A[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.print("1.請輸入姓名:"); String name=br.readLine(); System.out.print("2.請輸入國文成績:"); String s1=br.readLine(); int n1=Integer.parseInt(s1); System.out.print("3.請輸入英文成績:"); String s2=br.readLine(); int n2=Integer.parseInt(s2); System.out.print("4.請輸入數學成績"); String s3=br.readLine(); int n3=Integer.parseInt(s3); int sum=n1+n2+n3; double avg=(n1+n2+n3)/3.0; System.out.println("-------------------------"); System.out.println("姓名:"+ name); System.out.println("國文:"+ s1+"\n英文:"+ s2+"\n數學:"+ s3); System.out.println("總分:"+ sum); System.out.println("平均"+ avg); //if 語法 if(avg>100) System.out.println("輸入錯誤!平均不可大於100"); if(avg>=90 && avg<=100) System.out.println("成績等級:A"); if(avg>=80 && avg<90) System.out.println("成績等級:B"); if(avg>=70 && avg<80) System.out.println("成績等級:C"); if(avg>=60 && avg<70) System.out.println("成績等級:D"); if(avg>=0 && avg<60) System.out.println("成績等級:E"); if(avg<0) System.out.println("輸入錯誤!平均不可小於0"); } } ``` ### if - else 語法 if(判斷條件){ 條件成立時,執行內容 } else if(判斷條件){ 條件成立時,執行內容 } . . . else{ 以上條件皆不成立時,執行內容 } ```java= import java.io.*; public class A3_2 { public static void main (String A[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.print("1.請輸入姓名:"); String name=br.readLine(); System.out.print("2.請輸入國文成績:"); String s1=br.readLine(); int n1=Integer.parseInt(s1); System.out.print("3.請輸入英文成績:"); String s2=br.readLine(); int n2=Integer.parseInt(s2); System.out.print("4.請輸入數學成績"); String s3=br.readLine(); int n3=Integer.parseInt(s3); int sum=n1+n2+n3; double avg=(n1+n2+n3)/3.0; System.out.println("-------------------------"); System.out.println("姓名:"+ name); System.out.println("國文:"+ s1+"\n英文:"+ s2+"\n數學:"+ s3); System.out.println("總分:"+ sum); System.out.println("平均"+ avg); //if else 語法 if(avg>100) System.out.println("輸入錯誤!平均不可大於100"); else if(avg>=90 && avg<=100) System.out.println("成績等級:A"); else if(avg>=80) System.out.println("成績等級:B"); else if(avg>=70) System.out.println("成績等級:C"); else if(avg>=60) System.out.println("成績等級:D"); else if(avg>=0) System.out.println("成績等級:E"); else System.out.println("輸入錯誤!平均不可小於0"); } } ``` ### switch case 語法 switch(變數名稱或運算式){ case 符合數字或字元: 條件成立時,執行內容 break; case 符合數字或字元: 條件成立時,執行內容 break; . . . default: 以上條件皆不成立時,執行內容 ```java= import java.io.*; public class A3_3 { public static void main (String A[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.print("1.請輸入姓名:"); String name=br.readLine(); System.out.print("2.請輸入國文成績:"); String s1=br.readLine(); int n1=Integer.parseInt(s1); System.out.print("3.請輸入英文成績:"); String s2=br.readLine(); int n2=Integer.parseInt(s2); System.out.print("4.請輸入數學成績"); String s3=br.readLine(); int n3=Integer.parseInt(s3); int sum=n1+n2+n3; double avg=(n1+n2+n3)/3.0; System.out.println("-------------------------"); System.out.println("姓名:"+ name); System.out.println("國文:"+ s1+"\n英文:"+ s2+"\n數學:"+ s3); System.out.println("總分:"+ sum); System.out.println("平均"+ avg); //switch case int level=(int)avg/10; switch(level){ case 10: System.out.println("成績等級:A"); break; case 9: System.out.println("成績等級:A"); break; case 8: System.out.println("成績等級:B"); break; case 7: System.out.println("成績等級:C"); break; case 6: System.out.println("成績等級:D"); break; default: if(avg>100) System.out.println("輸入錯誤!平均不可大於100"); if(avg<0) System.out.println("輸入錯誤!平均不可小於0"); if(avg<60 && avg>=0) System.out.println("成績等級:E"); break; } } } ``` ### ? : 語法 ((判斷條件) ? 成立時,執行內容 : 不成立時,執行內容); ```java= import java.io.*; public class A3_4 { public static void main (String A[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.print("1.請輸入姓名:"); String name=br.readLine(); System.out.print("2.請輸入國文成績:"); String s1=br.readLine(); int n1=Integer.parseInt(s1); System.out.print("3.請輸入英文成績:"); String s2=br.readLine(); int n2=Integer.parseInt(s2); System.out.print("4.請輸入數學成績"); String s3=br.readLine(); int n3=Integer.parseInt(s3); int sum=n1+n2+n3; double avg=(n1+n2+n3)/3.0; System.out.println("-------------------------"); System.out.println("姓名:"+ name); System.out.println("國文:"+ s1+"\n英文:"+ s2+"\n數學:"+ s3); System.out.println("總分:"+ sum); System.out.println("平均"+ avg); //?: System.out.println((avg>100)?"輸入錯誤!平均不可大於100":(avg>=90 && avg<=100)?"成績等級:A":(avg>=80)?"成績等級:B":(avg>=70)?"成績等級:C":(avg>=60)?"成績等級:D":(avg>=0)?"成績等級:E":"輸入錯誤!平均不可小於0"); } } ``` Output 範例一: 1.請輸入姓名:Lin 2.請輸入國文成績:80 3.請輸入英文成績:70 4.請輸入數學成績60 ------------------------- 姓名:Lin 國文:80 英文:70 數學:60 總分:210 平均70.0 成績等級:C 範例二: 1.請輸入姓名:Tom 2.請輸入國文成績:150 3.請輸入英文成績:150 4.請輸入數學成績150 ------------------------- 姓名:Tom 國文:150 英文:150 數學:150 總分:450 平均150.0 輸入錯誤!平均不可大於100 ## CH4 ### for 迴圈 **單層for迴圈** for(初始變數; 判斷式; 遞增式) { 條件成立時,執行內容 } ```java= public class A4_1 { public static void main (String A[]) { System.out.print("*"); System.out.print("*"); System.out.print("*"); System.out.print("*"); System.out.print("*"); System.out.println("*"); int i; for(i=1;i<=6;i++) { System.out.print(i+" "); } System.out.println("\nfor迴圈中斷時,i="+i); } } ``` **雙層for迴圈** for(初始變數; 判斷式; 遞增式) { for(初始變數; 判斷式; 遞增式) { 條件成立時,執行內容 } } ```java= public class A4_2 { public static void main (String A[]) { for(int i=1;i<=6;i++) { for(int j=1;j<=i;j++) { System.out.print("*"); } System.out.print("\n"); } } } ``` ### [練習]:薪資計算 輸入說明: 輸入時薪、工作天數和每日工作時數 輸出說明: 輸出當日薪資、總工時和總薪資 ```java= import java.io.*; public class A4_3 { public static void main (String A[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.print("1.請輸入時薪:"); String s1=br.readLine(); int 時薪=Integer.parseInt(s1); System.out.print("2.請輸入天數:"); String s2=br.readLine(); int 天數=Integer.parseInt(s2); int 總薪資=0,總工時=0; for(int i=1;i<=天數;i++) { System.out.print("3.請輸入第"+i+"天時數:"); String s3=br.readLine(); int 時數=Integer.parseInt(s3); int 當日薪資=時薪*時數; System.out.println("當日薪資:"+當日薪資); 總薪資=總薪資+當日薪資; 總工時=總工時+時數; } System.out.println("\n總工時:"+總工時+" 總薪資:"+總薪資); } } ``` ### while 迴圈 while(判斷條件){ 條件成立時,執行內容 } ```java= import java.io.*; public class A4_4 { public static void main (String A[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.print("1.請輸入時薪:"); String s1=br.readLine(); int 時薪=Integer.parseInt(s1); //while while(時薪<=0) { System.out.print("1.請輸入時薪:"); s1=br.readLine(); 時薪=Integer.parseInt(s1); } System.out.print("2.請輸入天數:"); String s2=br.readLine(); int 天數=Integer.parseInt(s2); //while while (天數<=0){ System.out.print("2.請輸入天數:"); s2=br.readLine(); 天數=Integer.parseInt(s2); } int 總薪資=0,總工時=0; for(int i=1;i<=天數;i++) { System.out.print("3.請輸入第"+i+"天時數:"); String s3=br.readLine(); int 時數=Integer.parseInt(s3); int 當日薪資=時薪*時數; System.out.println("當日薪資:"+當日薪資); 總薪資=總薪資+當日薪資; 總工時=總工時+時數; } System.out.println("\n總工時:"+總工時+" 總薪資:"+總薪資); } } ``` ### do - while 迴圈 do{ 條件成立時,執行內容 }while(判斷條件); do-while 至少執行內容1次 ```java= import java.io.*; public class A4_5 { public static void main (String A[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); int 時薪; //do-while 迴圈 do { System.out.print("1.請輸入時薪:"); String s1=br.readLine(); 時薪=Integer.parseInt(s1); }while (時薪<=0); int 天數; //do-while 迴圈 do { System.out.print("2.請輸入天數:"); String s2=br.readLine(); 天數=Integer.parseInt(s2); }while (天數<=0); int 總薪資=0,總工時=0; for(int i=1;i<=天數;i++) { System.out.print("3.請輸入第"+i+"天時數:"); String s3=br.readLine(); int 時數=Integer.parseInt(s3); int 當日薪資=時薪*時數; System.out.println("當日薪資:"+當日薪資); 總薪資=總薪資+當日薪資; 總工時=總工時+時數; } System.out.println("\n總工時:"+總工時+" 總薪資:"+總薪資); } } ``` Output 1.請輸入時薪:168 2.請輸入天數:3 3.請輸入第1天時數:8 當日薪資:1344 3.請輸入第2天時數:10 當日薪資:1680 3.請輸入第3天時數:6 當日薪資:1008 總工時:24 總薪資:4032 ### [練習]:區間內2和3的倍數 說明: for 迴圈、while 迴圈、do-while 迴圈 三種作法 ```java= import java.io.*; public class A4_6 { public static void main (String A[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.print("1.請輸入起始值:"); String s1=br.readLine(); int start=Integer.parseInt(s1); while(start<0) { System.out.print("1.請輸入起始值:"); s1=br.readLine(); start=Integer.parseInt(s1); } int end; do { System.out.print("2.請輸入終止值:"); String s2=br.readLine(); end=Integer.parseInt(s2); }while(end<0); int sum=0,t=0; //for 迴圈 for(int i=start;i<=end;i++) { if((i%2==0)||(i%3==0)) { System.out.print(i+" "); sum=sum+i; t=t+1; } } System.out.println("\n------------"); System.out.println("2和3倍數的個數:"+t); System.out.println("2和3倍數的總和:"+sum); //while 迴圈 int i=start;sum=0;t=0; while(i<=end) { if((i%2==0)||(i%3==0)) { System.out.print(i+" "); sum=sum+i; t=t+1; } i=i+1; } System.out.println("\n------------"); System.out.println("2和3倍數的個數:"+t); System.out.println("2和3倍數的總和:"+sum); //do while 迴圈 i=start;sum=0;t=0; do { if((i%2==0)||(i%3==0)) { System.out.print(i+" "); sum=sum+i; t=t+1; } i=i+1; }while(i<=end); System.out.println("\n------------"); System.out.println("2和3倍數的個數:"+t); System.out.println("2和3倍數的總和:"+sum); } } ``` Output 1.請輸入起始值:1 2.請輸入終止值:50 2 3 4 6 8 9 10 12 14 15 16 18 20 21 22 24 26 27 28 30 32 33 34 36 38 39 40 42 44 45 46 48 50 ------------ 2和3倍數的個數:33 2和3倍數的總和:842 ### [練習]:猜數字遊戲 遊戲介紹: 根據提示輸入1~10間的整數,並成功猜出數字 [補充]: 隨機亂數產生 Math.random():隨機產生 0 ~ 1 間的數值 (不等於1) int 變數名稱=(int)(Math.random()*最大值+最小值) ```java= import java.io.*; public class A4_7 { public static void main (String A[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); int p=(int)(Math.random()*10+1),i=0; System.out.println(p); //while 迴圈 while(i!=p){ //System.out.println((p<=5)?"[提示]:電腦出的數字小於6":"[提示]:電腦出的數字大於5"); if(p<=5) System.out.println("[提示]:電腦出的數字小於6"); else System.out.println("[提示]:電腦出的數字大於5"); System.out.print("請輸入一個數: "); String s=br.readLine(); i=Integer.parseInt(s); if(i!=p) System.out.println("沒猜到喔!猜到對才能閃人"); else{ System.out.println("恭喜猜對喔!"); } } //do-while 迴圈 do{ if(p<=5) System.out.println("[提示]:電腦出的數字小於6"); else System.out.println("[提示]:電腦出的數字大於5"); System.out.print("請輸入一個數: "); String s=br.readLine(); i=Integer.parseInt(s); if(i!=p) System.out.println("沒猜到喔!猜到對才能閃人"); else{ System.out.println("恭喜猜對喔!"); break; } }while(true); } } ``` Output [提示]:電腦出的數字小於6 請輸入一個數: 2 沒猜到喔!猜到對才能閃人 [提示]:電腦出的數字小於6 請輸入一個數: 5 沒猜到喔!猜到對才能閃人 [提示]:電腦出的數字小於6 請輸入一個數: 4 沒猜到喔!猜到對才能閃人 [提示]:電腦出的數字小於6 請輸入一個數: 3 沒猜到喔!猜到對才能閃人 [提示]:電腦出的數字小於6 請輸入一個數: 1 恭喜猜對喔! ### [練習]:隨機四則運算 輸入說明: 輸入算術運算子和兩數值 輸出說明: 輸出算是運算後的結果 (若輸入算術運算子非加、減、乘、除,則輸出 "是未知的運算子" ) ```java= import java.io.*; public class A4_8 { public static void main (String A[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.print("請輸入算術運算子: "); String oper=br.readLine(); System.out.print("請輸入n1: "); String s1=br.readLine(); int n1=Integer.parseInt(s1); System.out.print("請輸入n2: "); String s2=br.readLine(); int n2=Integer.parseInt(s2); switch(oper){ case "+": System.out.println(n1+"+"+n2+"="+(n1+n2)); break; case "-": System.out.println(n1+"-"+n2+"="+(n1-n2)); break; case "*": System.out.println(n1+"*"+n2+"="+(n1*n2)); break; case "/": System.out.println(n1+"/"+n2+"="+(n1/n2)); break; default: System.out.print(oper+"是未知的運算子"); } System.out.print("程式結束"); } } ``` Output 請輸入算術運算子: * 請輸入n1: 4 請輸入n2: 25 4*25=100 程式結束 ### [練習]:九九乘法表 ```java= import java.io.*; public class A4_9 { public static void main (String A[]) { //for 迴圈 for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++){ System.out.print(i + "*"+j+"="+(i*j)+"\t"); } System.out.print("\n"); } int i=1,j=1; System.out.print("\n"); //while 迴圈 while(i<=9){ j=1; while(j<=9){ System.out.print(i + "*"+j+"="+(i*j)+"\t"); j=j+1; } System.out.print("\n"); i=i+1; } System.out.print("\n"); //do while 迴圈 i=1;j=1; do{ j=1; do{ System.out.print(i + "*"+j+"="+(i*j)+"\t"); j=j+1; }while(j<=9); System.out.print("\n"); i=i+1; }while(i<=9); } } ``` Output 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 (重複三次) ### [練習]:四則運算闖關遊戲 規則介紹: 遊戲順序:加法 -> 減法 -> 乘法 ->除法 每種運算有三次作答機會,答對晉級 答錯一、二次可繼續作答 答錯三次則退回上一關(加法直到答對才晉級) 除法運算答對即可過關 ```java= import java.io.*; public class A4_10 { public static void main (String A[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); int n1,n2,usr; int b=1; int a=1; int i=1; int level=1; while(level!=5){ n1=(int)(Math.random()*10+1); n2=(int)(Math.random()*10+1); switch (level){ //加法 case 1: System.out.print("第"+a+"題: "+n1+"+"+n2+"="); String s=br.readLine(); usr=Integer.parseInt(s); if(usr==n1+n2){ System.out.println("恭喜答對! 晉級[減法運算]!"); level=level+1; i=1; } else{ System.out.println("抱歉答錯!"); } a++; break; //減法 case 2: System.out.print("第"+a+"題: "+n1+"-"+n2+"="); s=br.readLine(); usr=Integer.parseInt(s); if(usr==n1-n2){ System.out.println("恭喜答對! 晉級[乘法運算]!"); level=level+1; i=1; } else{ if(i<3){ System.out.println("抱歉答錯! 答錯"+i+"次 要回到[加法運算]! 剩"+(3-i)+"次"); i=i+1; } else if(i>=3){ System.out.println("抱歉答錯! 答錯"+i+"次 要回到[加法運算]!"); level=1; i=1; } } a++; break; //乘法 case 3: System.out.print("第"+a+"題: "+n1+"*"+n2+"="); s=br.readLine(); usr=Integer.parseInt(s); if(usr==n1*n2){ System.out.println("恭喜答對!"); level=level+1; i=1; } else{ if(i<3){ System.out.println("抱歉答錯! 答錯"+i+"次 要回到[減法運算]! 剩"+(3-i)+"次"); i=i+1; } else if(i>=3){ System.out.println("抱歉答錯! 答錯"+i+"次 要回到[減法運算]!"); level=2; i=1; } } a++; break; //除法 case 4: System.out.print("第"+a+"題: "+n1+"/"+n2+"="); s=br.readLine(); usr=Integer.parseInt(s); if(usr==n1/n2){ System.out.println("恭喜全數答對!"); level=level+1; i=1; } else{ if(i<3){ System.out.println("抱歉答錯! 答錯"+i+"次 要回到[乘法運算]! 剩"+(3-i)+"次"); i=i+1; } else if(i>=3){ System.out.println("抱歉答錯! 答錯"+i+"次 要回到[乘法運算]!"); level=3; i=1; } } a++; break; } } } } ``` Output 第1題: 6+10=11 抱歉答錯! 第2題: 7+1=8 恭喜答對! 晉級[減法運算]! 第3題: 7-7=1 抱歉答錯! 答錯1次 要回到[加法運算]! 剩2次 第4題: 8-4=4 恭喜答對! 晉級[乘法運算]! 第5題: 5*1=6 抱歉答錯! 答錯1次 要回到[減法運算]! 剩2次 第6題: 4*7=28 恭喜答對! 第7題: 9/9=2 抱歉答錯! 答錯1次 要回到[乘法運算]! 剩2次 第8題: 8/2=2 抱歉答錯! 答錯2次 要回到[乘法運算]! 剩1次 第9題: 4/9=2 抱歉答錯! 答錯3次 要回到[乘法運算]! 第10題: 5*7=35 恭喜答對! 第11題: 10/8=1 恭喜全數答對! ## CH5 ### 一維陣列 宣告 一維陣列宣告: int A[]; A=new int [儲存空間個數]; int A[]=new int [儲存空間個數]; <--簡化 int B[]={儲存數值}; //直接存數值進陣列中 ```java= import java.io.*; public class A5_1 { public static void main (String a[]){ int A[]; A=new int [5]; //int A[]=new int [5]; 簡化 A[0]=10; A[1]=0; A[2]=20; A[3]=0; A[4]=30; System.out.println("A[]陣列記憶體大小:"+A.length); for(int i=0;i<5;i++){ System.out.println("A["+i+"]= "+A[i]); } } } ``` Output A[]陣列記憶體大小:5 A[0]= 10 A[1]= 0 A[2]= 20 A[3]= 0 A[4]= 30 ### 一維陣列 運算 ```java= import java.io.*; public class A5_2 { public static void main (String a[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); int B[]=new int[5]; int sum=0; for(int i=0;i<5;i++){ System.out.print("請輸入B["+i+"]"+"數值: "); String s=br.readLine(); B[i]=Integer.parseInt(s); } for(int i=0;i<5;i++){ System.out.println("B["+i+"]= "+B[i]); sum=sum+B[i]; } System.out.println("B[]陣列數值總和= "+sum); } } ``` Output 請輸入B[0]數值: 11 請輸入B[1]數值: 13 請輸入B[2]數值: 15 請輸入B[3]數值: 17 請輸入B[4]數值: 19 B[0]= 11 B[1]= 13 B[2]= 15 B[3]= 17 B[4]= 19 B[]陣列數值總和= 75 ### [練習]:終極密碼 遊戲介紹: 電腦隨機產生1~100中的任意數字為答案,玩家答錯繼續,答對離開 ```java= import java.io.*; public class A5_3 { public static void main (String a[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); int A[]={1,100}; int p=(int)(Math.random()*100+1); int usr=0; System.out.println("[終極密碼]:電腦隨機產生1~100中的任意數字為答案,玩家答錯繼續,答對離開"); while(usr!=p){ System.out.print("請輸入大於"+A[0]+"小於"+A[1]+"的數字: "); String s=br.readLine(); usr=Integer.parseInt(s); if(usr == p){ System.out.println("答對啦! 答案就是"+p+",真是好運啊!"); } else if(usr<p && usr>A[0]){ A[0]=usr; System.out.println("Sorry,沒猜到 範圍在:"+A[0]+"到"+A[1]); } else if(usr>p && usr<A[1]){ A[1]=usr; System.out.println("Sorry,沒猜到 範圍在:"+A[0]+"到"+A[1]); } else{ System.out.println("請重新輸入!!"); } } } } ``` Output [終極密碼]:電腦隨機產生1~100中的任意數字為答案,玩家答錯繼續,答對離開 請輸入大於1小於100的數字: 50 Sorry,沒猜到 範圍在:50到100 請輸入大於50小於100的數字: 75 Sorry,沒猜到 範圍在:75到100 請輸入大於75小於100的數字: 85 Sorry,沒猜到 範圍在:75到85 請輸入大於75小於85的數字: 80 答對啦! 答案就是80,真是好運啊! ### [練習]:猜樂透 輸入說明: 輸入樂透組數 輸出說明: 輸出隨機產生號碼,每組六個數(由小排到大、每組號碼不重複) [補充]: 排序演算法:氣泡排序 由小排到大 int tmp; for(int i=0;i<陣列大小;i++){ for(int j=0;j<i;j++){ if(A[j]>A[i]){ tmp=A[i]; A[i]=A[j]; A[j]=tmp; } } } ```java= import java.io.*; import java.util.*; public class A5_4 { public static void main (String a[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.print("請輸入組數:"); String s=br.readLine(); int n=Integer.parseInt(s); int p=1; while (p<=n){ int A[]=new int [6]; for(int i=0;i<6;i++){ A[i]=(int)(Math.random()*49+1); for(int j=0;j<i;j++){ if(A[i]==A[j]){ A[i]=(int)(Math.random()*49+1); j=0; } } } int tmp=0; for(int i=0;i<6;i++){ for(int j=0;j<i;j++){ if(A[j]>A[i]){ tmp=A[i]; A[i]=A[j]; A[j]=tmp; } } } Arrays.sort(A); //排序(由小到大) System.out.print("第"+p+"組: "); for(int i=0;i<6;i++){ System.out.print(A[i]+"\t"); } p=p+1; System.out.println(); } } } ``` Output 請輸入組數:5 第1組: 13 14 15 33 36 37 第2組: 8 30 33 37 44 47 第3組: 20 22 31 33 35 38 第4組: 14 19 23 34 36 41 第5組: 6 26 27 35 43 45 ### 二微陣列 宣告 二維陣列宣告: int A[列數][行數]; A=new int [列儲存空間個數][行儲存空間個數]; 簡化 --> int A[][]=new int [列儲存空間個數][行儲存空間個數]; int B[][]={第一列儲存數值,第二列儲存數值,...,第N列儲存數值}; ```java= import java.io.*; public class A5_5 { public static void main (String a[]) { int A[][]=new int[3][4]; A[0][1]=100; A[1][2]=200; A[2][3]=300; System.out.println("A[][]陣列列數:"+3); for(int i=0;i<A.length;i++){ System.out.print("第"+i+"列長度:"+4+"\t"); for(int j=0;j<A[i].length;j++){ System.out.print("A["+i+"]["+j+"]="+A[i][j]+"\t"); } System.out.println(); } } } ``` Output A[][]陣列列數:3 第0列長度:4 A[0][0]=0 A[0][1]=100 A[0][2]=0 A[0][3]=0 第1列長度:4 A[1][0]=0 A[1][1]=0 A[1][2]=200 A[1][3]=0 第2列長度:4 A[2][0]=0 A[2][1]=0 A[2][2]=0 A[2][3]=300 ### 二維陣列 運算 ```java= import java.io.*; import java.util.*; public class A5_6 { public static void main (String a[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); int sum=0; int B[][]={{99,44,33,66},{77,11},{22,88,55}}; int max=B[0][0],min=B[0][0]; System.out.println("B[][]陣列長度:"+B.length); for(int i=0;i<B.length;i++){ System.out.print("第"+i+"列長度:"+B[i].length+"\t"); for(int j=0;j<B[i].length;j++){ System.out.print("B["+i+"]["+j+"]="+B[i][j]+"\t"); sum=sum+B[i][j]; if(B[i][j]>max){ max=B[i][j]; } if(B[i][j]<min){ min=B[i][j]; } } System.out.println(); } System.out.println("\n陣列總和="+sum); for(int i=0;i<B.length;i++){ for(int j=0;j<B[i].length;j++){ if(B[i][j]==max) System.out.println("最大值="+max+" 陣列座標:B["+i+"]["+j+"]"); if(B[i][j]==min) System.out.println("最小值="+min+" 陣列座標:B["+i+"]["+j+"]"); } } } } ``` Output B[][]陣列長度:3 第0列長度:4 B[0][0]=99 B[0][1]=44 B[0][2]=33 B[0][3]=66 第1列長度:2 B[1][0]=77 B[1][1]=11 第2列長度:3 B[2][0]=22 B[2][1]=88 B[2][2]=55 陣列總和=495 最大值=99 陣列座標:B[0][0] 最小值=11 陣列座標:B[1][1] ### 二維陣列 其他使用方式 宣告多個一維陣列: int C[][]=new int [3][]; int c1[]={存入陣列數值}; int c2[]={存入陣列數值}; int c3[]={存入陣列數值}; C[0]=c1; //第0列數值為c1 C[1]=c2; //第1列數值為c2 C[2]=c3; //第2列數值為c3 ```java= import java.io.*; import java.util.*; public class A5_7 { public static void main (String a[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); int C[][]=new int [3][]; int c1[]={11,22,33,44}; int c2[]=new int [2]; int c3[]={77,66,55}; C[0]=c1; C[1]=c2; C[2]=c3; System.out.println("C[][]陣列長度:"+C.length); for(int i=0;i<C.length;i++){ System.out.print("第"+i+"列長度:"+C[i].length+"\t"); for(int j=0;j<C[i].length;j++){ System.out.print("C["+i+"]["+j+"]="+C[i][j]+"\t"); } System.out.println(); } for(int i=0;i<C[2].length;i++){ System.out.print(c3[i]+"\t"); } System.out.println(); for(int i=0;i<C[0].length;i++){ System.out.print(c1[i]+"\t"); } System.out.println(); for(int i=0;i<C[1].length;i++){ System.out.print(c2[i]+"\t"); } System.out.println(); } } ``` Output C[][]陣列長度:3 第0列長度:4 C[0][0]=11 C[0][1]=22 C[0][2]=33 C[0][3]=44 第1列長度:2 C[1][0]=0 C[1][1]=0 第2列長度:3 C[2][0]=77 C[2][1]=66 C[2][2]=55 77 66 55 11 22 33 44 0 0 ### [練習]:計算銷售員業績 輸入說明: 輸入五件產品價格和三位銷售員的銷售量 輸出說明: 輸出三位銷售員業績、達成比率和最佳銷售員 ```java= import java.io.*; import java.util.*; public class A5_8 { public static void main (String a[])throws IOException { Scanner c= new Scanner(System.in); int max=0,Index=0; int A[]=new int[5]; int B[][]=new int[3][5]; int C[]=new int[3]; System.out.print("產品價格:"); int s; for(int i=0;i<A.length;i++){ s=c.nextInt(); A[i]=s; } for(int i=0;i<B.length;i++){ System.out.print("銷售員"+(i+1)+"的銷售量:"); for(int j=0;j<B[i].length;j++){ s=c.nextInt(); B[i][j]=s; } } for(int i=0;i<B.length;i++){ for(int j=0;j<B[i].length;j++){ C[i]=C[i]+(A[j]*B[i][j]); } } for(int i=0;i<B.length;i++){ System.out.println("銷售員"+(i+1)+"的業績:"+C[i]+",達成比率: "+((C[i]/10000.0)*100)+"%"); if(C[i]>max){ max=C[i]; Index=i+1; } } System.out.println("最佳銷售員"+Index+" 總業績: "+max); } } ``` Output 產品價格: 10 20 40 30 20 銷售員1的銷售量:100 200 100 200 110 銷售員2的銷售量:200 100 100 200 100 銷售員3的銷售量:100 200 200 100 200 銷售員1的業績:17200,達成比率: 172.0% 銷售員2的業績:16000,達成比率: 160.0% 銷售員3的業績:20000,達成比率: 200.0% 最佳銷售員3 總業績: 20000 ## CH6 ### 函數 - 變數使用 方法屬性 回傳值型態 方法名稱(引數1,引數2...){ 程式敘述 …… return 傳回值; } **無回傳值** ```java= public class A6_1 { public static void main (String a[]) { star(); Nstar(10); Dstar(15.5); } public static void star(){ for(int i=1;i<=5;i++){ System.out.print("*"); } System.out.println(); } public static void Nstar(int n){ for(int i=1;i<=n;i++){ System.out.print("*"); } System.out.println("\n n="+n); } public static void Dstar(double n){ for(int i=0;i<n;i++){ System.out.print("*"); } System.out.println("\n n="+n); } } ``` Output ***** ********** n=10 **************** n=15.5 **有回傳值** ```java= public class A6_3 { public static void main (String a[]) { System.out.println(Rstar(15,13.5)); double result=Rstar(15,13.5); System.out.println(" result="+result); } public static double Rstar(int m,double n){ for(int i=1;i<=m+n;i++){ System.out.print("*"); } System.out.println("\n m="+m+" n="+n); return m+n; //int+double --> double } } ``` Output **************************** m=15 n=13.5 28.5 **************************** m=15 n=13.5 result=28.5 ### 函數 - 一維陣列使用 **無回傳值** ```java= public class A6_4 { public static void main (String a[]) { AddSum(5,3,8,12,6); int A[]={5,3,8,12,6,3,4,7,9}; AddSumArray(A); } public static void AddSum(int n1,int n2,int n3,int n4,int n5){ int sum=n1+n2+n3+n4+n5; System.out.println("n1="+n1); System.out.println("n2="+n2); System.out.println("n3="+n3); System.out.println("n4="+n4); System.out.println("n5="+n5); System.out.println("sum="+sum); } public static void AddSumArray(int A[]){ int sum=0; System.out.println("A[]陣列記憶體空間:"+A.length+" 陣列位址:"+A); for(int i=0;i<A.length;i++){ sum=sum+A[i]; System.out.println("A["+i+"]="+A[i]); } System.out.println("sum="+sum); } } ``` Output n1=5 n2=3 n3=8 n4=12 n5=6 sum=34 A[]陣列記憶體空間:9 陣列位址:[I@15db9742 A[0]=5 A[1]=3 A[2]=8 A[3]=12 A[4]=6 A[5]=3 A[6]=4 A[7]=7 A[8]=9 sum=57 **有回傳值** ```java= public class A6_5 { public static void main (String a[]) { int A[]={5,3,8,12,6,3,4,7,9}; int B[]=AddNReturn(A,100); System.out.println("B[]陣列位址:"+B); //輸出位址 printOne(B,"B"); System.out.println("B[]陣列位址:"+AddNReturn(A,100)); //輸出位址 } public static int[] Astar(int m,double n){ for(int i=0;i<m+n;i++){ System.out.print("*"); } System.out.println("\n m="+m+" n="+n); int A[]={m,(int)n}; return A; } public static void printOne(int A[],String name){ for(int i=0;i<A.length;i++){ System.out.println(name+"["+i+"]="+A[i]); } } public static int[] AddNReturn(int A[],int N){ for(int i=0;i<A.length;i++){ A[i]=A[i]+N; } return A; } } ``` Output B[]陣列位址:[I@15db9742 B[0]=105 B[1]=103 B[2]=108 B[3]=112 B[4]=106 B[5]=103 B[6]=104 B[7]=107 B[8]=109 B[]陣列位址:[I@15db9742 ### 函數 - 二維陣列使用 ```java= public class A6_7 { public static void main (String a[]) { int A[][]={{11,22,33,44},{55,66},{77,88,99}}; printTwo(A,"A"); int B[][]=AddNArray(A,100); System.out.println("B陣列位址:"+B); //輸出位址 printTwo(B,"B"); } public static int[][] AddNArray(int A[][],int N){ for(int i=0;i<A.length;i++){ for(int j=0;j<A[i].length;j++){ A[i][j]=A[i][j]+N; } } return A; } public static void printTwo(int A[][],String name){ System.out.println(name+"[][]陣列列數:"+A.length); for(int i=0;i<A.length;i++){ System.out.print("第"+i+"列長度:"+A[i].length+"\t"); for(int j=0;j<A[i].length;j++){ System.out.print(name+"["+i+"]["+j+"]="+A[i][j]+"\t"); } System.out.println(); } } } ``` Output A[][]陣列列數:3 第0列長度:4 A[0][0]=11 A[0][1]=22 A[0][2]=33 A[0][3]=44 第1列長度:2 A[1][0]=55 A[1][1]=66 第2列長度:3 A[2][0]=77 A[2][1]=88 A[2][2]=99 B陣列位址:[I@15db9742 B[][]陣列列數:3 第0列長度:4 B[0][0]=111 B[0][1]=122 B[0][2]=133 B[0][3]=144 第1列長度:2 B[1][0]=155 B[1][1]=166 第2列長度:3 B[2][0]=177 B[2][1]=188 B[2][2]=199 ### [練習]:計算銷售員業績(函數版) 輸入說明: 輸入五件產品價格和三位銷售員的銷售量 輸出說明: 輸出三位銷售員業績、達成比率和最佳銷售員 ```java= import java.io.*; import java.util.*; public class A6_8 { public static void main (String a[])throws IOException { int A[]=input_Good(5); int B[][]=input_Sale(3,5); int C[]=Sale(A,B); number(C,B.length); } public static int[] input_Good(int n){ // 輸入商品價格 Scanner c= new Scanner(System.in); int A[]=new int[n]; System.out.print("產品價格:"); int s; for(int i=0;i<n;i++){ s=c.nextInt(); A[i]=s; } return A; } public static int[][] input_Sale(int a,int b){ // 輸入銷售數量 int B[][]=new int [a][b]; Scanner c= new Scanner(System.in); int s; for(int i=0;i<a;i++){ System.out.print("銷售員"+(i+1)+"的銷售量:"); for(int j=0;j<b;j++){ s=c.nextInt(); B[i][j]=s; } } return B; } public static int[] Sale(int A[],int B[][]){ //計算銷售員業績 int C[]=new int[3]; for(int i=0;i<B.length;i++){ for(int j=0;j<B[i].length;j++){ C[i]=C[i]+(A[j]*B[i][j]); } } return C; } public static void number(int C[],int B){ //業績排名 int max=0,Index=0; for(int i=0;i<B;i++){ System.out.println("銷售員"+(i+1)+"的業績:"+C[i]+",達成比率: "+((C[i]/10000.0)*100)+"%"); if(C[i]>max){ max=C[i]; Index=i+1; } } System.out.println("最佳銷售員"+Index+" 總業績: "+max); } } ``` Output 產品價格: 10 20 40 30 20 銷售員1的銷售量:100 200 100 200 110 銷售員2的銷售量:200 100 100 200 100 銷售員3的銷售量:100 200 200 100 200 銷售員1的業績:17200,達成比率: 172.0% 銷售員2的業績:16000,達成比率: 160.0% 銷售員3的業績:20000,達成比率: 200.0% 最佳銷售員3 總業績: 20000 ## CH7 ### 物件導向 類別(class):對真實事物的抽象描述 ex:設計圖、藍圖... 物件(object):實體、實例 使用方法: [步驟一]描述類別: class 類別名稱{ 資料成員(屬性)--> int a=0; //宣告field doube b=10.0; 方法成員(功能)--> void 方法名稱 (){ 方法內容 } } [步驟二]生成物件: 類別名稱 變數名稱 = new 類別名稱(); //命名物件 變數名稱.方法名稱(); //匿名物件 [步驟三]物件操作: 變數名稱.資料成員; ```java= class 房子{ int 寬 = 200; int 高 = 100; int 樓層 = 32; void 游泳池(){ System.out.println("使用游泳池"); } void 健身房(){ System.out.println("使用健身房"); } } public class A7 { public static void main (String a[]) { new 房子().游泳池(); //匿名物件 房子 帝寶 = new 房子(); //命名物件 System.out.println("帝寶.寬:"+帝寶.寬+" 高:"+帝寶.高+" 樓層:"+帝寶.樓層); 帝寶.健身房(); } } ``` Output 使用游泳池 帝寶.寬:200 高:100 樓層:32 使用健身房 ### [練習]:計算BMI(使用物件導向) 輸入說明: 輸入身高和體重 輸出說明: 輸出計算後的BMI值 ```java= import java.io.*; class 體脂肪 { double BMI(int a,int b){ double bmi,h; h=a/100.0; bmi=b/(h*h); return bmi; } } public class A7_1 { public static void main (String a[])throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.print("請輸入身高(cm):"); //輸入身高 String s=br.readLine(); int h=Integer.parseInt(s); System.out.print("請輸入體重(kg):"); //輸入體重 s=br.readLine(); int w=Integer.parseInt(s); 體脂肪 Tom = new 體脂肪 (); //使用物件導向(體脂肪) double n = Tom.BMI(h,w); System.out.println("BMI值:"+n+"%"); } } ``` Output 請輸入身高(cm):160 請輸入體重(kg):50 BMI值:19.531249999999996% ### 關鍵字:this 使用 可在field 前面加上this,即「this.field名稱」 此時的this即代表取用此field的物件 ```java= class 人類 { private int 眼=2; private int 耳=2; private int 口=1; private int 鼻=1; public void showField(String name){ System.out.println("this.眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } } public class A7_2{ public static void main (String a[]){ 人類 亞當 = new 人類(); 人類 夏娃 = new 人類(); System.out.println("物件成員:"); 亞當.showField("亞當"); 夏娃.showField("夏娃"); } } ``` ### 使用權限 public(公開):可使用於程式的任何地方 protected(保護):對於有關係的類別為public,無關的類別為private default(預設):java的預設許可權,當沒有使用上面提到的任何訪問限定詞時,就使用它 private(私有):僅限使用於該類別中 ```java= class 人類 { private int 眼=2; //private 私有:只限類別內部使用 private int 耳=2; private int 口=1; private int 鼻=1; void 吃(String name){ System.out.println(name+"呼叫吃的方法"); } protected void showField(String name){ //protected : 僅限相關可使用 String 眼="[我是區域變數眼睛]"; System.out.println(name+".眼="+眼+" 耳="+耳+" 口="+口+" 鼻="+鼻); System.out.println("this.眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } void setField(int m,int n,int o,int p,String name){ //default :java預設使用(不須設定) if(m<0 || n<0 || o<0 || p<0) System.out.println("設定錯誤!!"); else{ 眼=m; 耳=n; 口=o; 鼻=p; } this.showField(name); } } public class A7_2{ public static void main (String a[]){ 人類 亞當 = new 人類(); 人類 夏娃 = new 人類(); 夏娃.吃("夏娃"); System.out.println("初始物件成員:"); 亞當.showField("亞當"); 夏娃.showField("夏娃"); System.out.println("修改後物件成員:"); 夏娃.setField(1,3,5,7,"夏娃"); 亞當.setField(2,4,6,8,"亞當"); } } ``` ## CH8 ### 多載(Overloading) 多載是指將相同的方法名稱,如果引數個數不同, 或者是引數個數相同、型態不同,方法便具有不同功能 public 類別名稱(){ //+void --> 方法(非建構元) } public 類別名稱(){ } public 類別名稱(int m,int n){ } public 類別名稱(int m,int n,int o){ } public 類別名稱(int m,int n,int o,int p){ } ### 建構元 建構元可視為一種特殊的方法,定義方式與方法類似 修飾子 類別名稱(型態 引數,....){ //建構元的名稱必須和類別名稱相同(建構元不須加void) 程式敘述; //建構元沒有回傳值 } ```java= class 人類2 { private int 眼=2; private int 耳=2; private int 口=1; private int 鼻=1; public void showField(String name){ System.out.println("this.眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } public 人類2(){ //若+void --> 方法(非建構元) System.out.println("0.人類建構元(),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } public 人類2(int m){ this.眼=m; System.out.println("1.人類建構元(int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } public 人類2(int m,int n){ this(m); //只能加在建構元敘述內容的第一行 this.眼=m; this.耳=n; System.out.println("2.人類建構元(int,int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } public 人類2(int m,int n,int o){ this.眼=m; this.耳=n; this.口=o; System.out.println("3.人類建構元(int,int,int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } public 人類2(int m,int n,int o,int p){ this.眼=m; this.耳=n; this.口=o; this.鼻=p; System.out.println("4.人類建構元(int,int,int,int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } public void setField(int m,String name){ if(m<0) System.out.println("設定錯誤!!"); else{ 眼=m; } this.showField("1."+name); } public void setField(int m,int n,String name){ if(m<0 || n<0) System.out.println("設定錯誤!!"); else{ 眼=m; 耳=n; } this.showField("2."+name); } public void setField(int m,int n,int o,String name){ if(m<0 || n<0 || o<0 ) System.out.println("設定錯誤!!"); else{ 眼=m; 耳=n; 口=o; } this.showField("3."+name); } public void setField(int m,int n,int o,int p,String name){ if(m<0 || n<0 || o<0 || p<0) System.out.println("設定錯誤!!"); else{ 眼=m; 耳=n; 口=o; 鼻=p; } this.showField("4."+name); } } public class A8_1{ public static void main (String a[]){ 人類2 亞當 = new 人類2(11); 人類2 夏娃 = new 人類2(11,22); 人類2 張三 = new 人類2(11,22,33); 人類2 李四 = new 人類2(11,22,33,44); 人類2 王五 = new 人類2(); System.out.println("初始物件成員:"); 亞當.showField("亞當"); 夏娃.showField("夏娃"); System.out.println("修改後物件成員:"); 夏娃.setField(1,"夏娃"); 亞當.setField(2,4,"亞當"); 張三.setField(3,5,7,"張三"); 李四.setField(6,7,8,9,"李四"); } } ``` Output 1.人類建構元(int),眼=11 this.耳=2 this.口=1 this.鼻=1 1.人類建構元(int),眼=11 this.耳=2 this.口=1 this.鼻=1 2.人類建構元(int,int),眼=11 this.耳=22 this.口=1 this.鼻=1 3.人類建構元(int,int,int),眼=11 this.耳=22 this.口=33 this.鼻=1 4.人類建構元(int,int,int,int),眼=11 this.耳=22 this.口=33 this.鼻=44 0.人類建構元(),眼=2 this.耳=2 this.口=1 this.鼻=1 初始物件成員: this.眼=11 this.耳=2 this.口=1 this.鼻=1 this.眼=11 this.耳=22 this.口=1 this.鼻=1 修改後物件成員: this.眼=1 this.耳=22 this.口=1 this.鼻=1 this.眼=2 this.耳=4 this.口=1 this.鼻=1 this.眼=3 this.耳=5 this.口=7 this.鼻=1 this.眼=6 this.耳=7 this.口=8 this.鼻=9 ### 實例變數 物件保有自己儲存field 的地方,而不與其他物件共用,據此特性的變數, 稱為實力變數(instance variable) 舉例: | 物件名稱 | 變數名稱 | 數值 | | -------- | -------- | -------- | | cir1 | pi | 3.14 | | | radius | 1.0 | | cir2 | pi | 3.14 | | | radius | 2.0 | ### 實例方法 需先建立物件,再利用物件來呼叫方法,稱為實例方法(instance method) 舉例: ``` CCircle cir1= new CCircle (1.0); //建立物件 cir1 cir1.show(); //由物件 cir1 呼叫 show() method CCircle cir1= new CCircle (2.0); //建立物件 cir2 cir2.show(); //由物件 cir2 呼叫 show() method ``` ### 靜態成員static static 是一個關鍵字,是用來修飾成員(member,類別的屬性、方法或子類別),使其成為靜態成員。 靜態的意思是,在程式載入記憶體的時候,跟著程式一起在記憶體中佔有空間, 而不是主程式開始執行後才跟記憶體要空間。 ### 類別變數 可由所有物件共享,每個物件的「類別變數」均相同, 更改變了某物件的「類別變數」後,其他物件的「類別變數」也會改變 必須在變數前加上「static」,可宣告為類別變數 舉例: private static double pi=3.14; //將pi宣告為「類別變數」 ### 類別方法 將方法宣告為「類別方法」,可直接由類別呼叫 在 method 之前加上 static 修飾子 舉例: ``` public static void count(){ //將count宣告成「類別方法」 方法內容; } //使用時可用類別呼叫它 CCircle.count(); //直接用CCircle類別呼叫「類別方法」 ``` ```java= class 人類3 { int 眼=2; int 耳=2; int 口=1; int 鼻=1; static int num; //類別變數 public 人類3(){ //+void --> 方法(非建構元) num++; System.out.println("0.人類建構元(),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } public 人類3(int m){ num++; this.眼=m; System.out.println("1.人類建構元(int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } public 人類3(int m,int n){ // this(m); //只能加在建構元敘述內容的第一行 num++; this.眼=m; this.耳=n; System.out.println("2.人類建構元(int,int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } public 人類3(int m,int n,int o){ num++; this.眼=m; this.耳=n; this.口=o; System.out.println("3.人類建構元(int,int,int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } public 人類3(int m,int n,int o,int p){ num++; this.眼=m; this.耳=n; this.口=o; this.鼻=p; System.out.println("4.人類建構元(int,int,int,int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } void showNum(){ System.out.println("總共生成"+num+"個人類物件"); System.out.println("實例變數,眼="+眼+" this.耳="+耳+" this.口="+口+" this.鼻="+鼻); showField(""); } public void compare(人類3 human){ System.out.println("this物件位址:"+this+" human物件位址:"+human); if(this==human) System.out.println("同一人,this.眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); else System.out.println("不同人,human.眼="+human.眼+" human..耳="+human.耳+" human.口="+human.口+" human.鼻="+human.鼻); } public 人類3 compareR(人類3 human){ //類別方法 int thisField=this.眼+this.耳+this.口+this.鼻; int humanField=human.眼+human.耳+human.口+human.鼻; System.out.println("thisField="+thisField+"humanField="+humanField); if(thisField>humanField){ System.out.println("this物件成員較大.眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); return this; } else{ System.out.println("human物件成員較大.眼="+human.眼+" human..耳="+human.耳+" human.口="+human.口+" human.鼻="+human.鼻); return human; } } public void showField(String name){ System.out.println("this.眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻); } } public class A8_2{ public static void main (String a[]){ 人類3 亞當 = new 人類3(11); 人類3 夏娃 = new 人類3(11,22); 人類3 張三 = new 人類3(11,22,33); 人類3 李四 = new 人類3(11,22,33,44); 人類3 王五 = new 人類3(); 亞當.showNum(); 夏娃.showNum(); 張三.showNum(); 李四.showNum(); 王五.showNum(); 人類3 Four=李四; 李四.compare(Four); 人類3 Five=張三.compareR(王五); 張三.compare(Five); } } ``` Output 1.人類建構元(int),眼=11 this.耳=2 this.口=1 this.鼻=1 2.人類建構元(int,int),眼=11 this.耳=22 this.口=1 this.鼻=1 3.人類建構元(int,int,int),眼=11 this.耳=22 this.口=33 this.鼻=1 4.人類建構元(int,int,int,int),眼=11 this.耳=22 this.口=33 this.鼻=44 0.人類建構元(),眼=2 this.耳=2 this.口=1 this.鼻=1 總共生成5個人類物件 實例變數,眼=11 this.耳=2 this.口=1 this.鼻=1 this.眼=11 this.耳=2 this.口=1 this.鼻=1 總共生成5個人類物件 實例變數,眼=11 this.耳=22 this.口=1 this.鼻=1 this.眼=11 this.耳=22 this.口=1 this.鼻=1 總共生成5個人類物件 實例變數,眼=11 this.耳=22 this.口=33 this.鼻=1 this.眼=11 this.耳=22 this.口=33 this.鼻=1 總共生成5個人類物件 實例變數,眼=11 this.耳=22 this.口=33 this.鼻=44 this.眼=11 this.耳=22 this.口=33 this.鼻=44 總共生成5個人類物件 實例變數,眼=2 this.耳=2 this.口=1 this.鼻=1 this.眼=2 this.耳=2 this.口=1 this.鼻=1 this物件位址:人類3@15db9742 human物件位址:人類3@15db9742 同一人,this.眼=11 this.耳=22 this.口=33 this.鼻=44 thisField=67humanField=6 this物件成員較大.眼=11 this.耳=22 this.口=33 this.鼻=1 this物件位址:人類3@6d06d69c human物件位址:人類3@6d06d69c 同一人,this.眼=11 this.耳=22 this.口=33 this.鼻=1 ## CH9 ### 繼承 : extends 繼承為單一繼承,(子)「繼承」可獲得(父)所有成員 (子)可使用(父)之成員 但(父)不可使用(子)之成員 ```java= class 青標{ int 現金 = 500000000; int 豪宅 = 2; int 跑車 = 3; void 當立委(){ System.out.println("當立委"); } void 當主委(){ System.out.println("當主委"); } } class 寬橫 extends 青標{ //寬橫 繼承 青標 int 電腦 = 1; void 消坡塊(){ System.out.println("做消坡塊"); } } public class A9_1 { public static void main(String[] args) { 青標 大言 = new 青標(); System.out.println("大言 現金:"+大言.現金+" 豪宅:"+大言.豪宅+" 跑車:"+大言.跑車); 大言.當立委(); 寬橫 小言 = new 寬橫(); System.out.println("小言 現金:"+小言.現金+" 豪宅:"+小言.豪宅+" 跑車:"+小言.跑車+" 電腦:"+小言.電腦); 小言.當主委(); 小言.消坡塊(); } } ``` Output 大言 現金:500000000 豪宅:2 跑車:3 當立委 小言 現金:500000000 豪宅:2 跑車:3 電腦:1 當主委 做消坡塊 ### 關鍵字 : super 在「繼承」中,當使用子類別「建構元」時,會先執行父類別的「建構元」(呼叫預設建構元或沒有引數建構元) super : 是用來呼叫父類別中的「特定建構元」 [注意] 1. super()的敘述必須寫在子類別建構元的第一行 2. super()可以多載,super會根據引數數目的型態,執行相對應之父類別建構元 ```java= class CCircle{ double pi = 3.14; double radius = 2.0; CCircle (){ //建構元 double pi = 3.14; double radius = 2.0; System.out.println("父0.CCircle()建構元, pi="+pi+" radius="+radius); show(); } CCircle (double r){ //建構元 double pi = 3.14; double radius = r; System.out.println("父1.CCircle(double)建構元, pi="+pi+" radius="+radius); show(); } void show(){ System.out.println("父 CCircle show(), pi="+pi+" radius="+radius+" area="+radius*radius*pi); } } class CCoin extends CCircle{ int value; CCoin(){ //建構元 value = 10; System.out.println("子0.CCoin()建構元, pi="+pi+" radius="+radius+" value="+value); setvalue(value); } CCoin(double v){ //建構元 super(v); //呼叫父類別相同類型建構元 value = (int)v; System.out.println("子1.CCoin()建構元, pi="+pi+" radius="+radius+" value="+value); setvalue(value); } void setvalue(int v){ value = v; System.out.println("子 CCoin setvalue(int), value="+value); } } public class A9_2 { public static void main(String[] args) { CCircle c1 = new CCircle(); CCoin c2 = new CCoin(5.0); c2.setvalue(3); } } ``` Output 父0.CCircle()建構元, pi=3.14 radius=2.0 父 CCircle show(), pi=3.14 radius=2.0 area=12.56 父1.CCircle(double)建構元, pi=3.14 radius=5.0 父 CCircle show(), pi=3.14 radius=2.0 area=12.56 子1.CCoin()建構元, pi=3.14 radius=2.0 value=5 子 CCoin setvalue(int), value=5 子 CCoin setvalue(int), value=3 ### [練習]: 樂透(進階版) 透過物件導向完成樂透選號程式(分為物件導向類別和主程式兩部分) 輸入: 使用者可選擇自選或隨機方式產生N組號碼(每組六個數值) 輸出: 經排序後,輸出各組數值 類別程式:Loto ```java= import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Scanner; public class Loto { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); private int num; public Loto(int num){ this.num=num; //this.num 為類別中 num為建構元中 System.out.println("樂透數值範圍:1~"+num); } public void play() throws IOException{ System.out.print("[開始樂透游戲]\n 1.自選 2.隨機:"); String s=br.readLine(); int n=Integer.parseInt(s); if(n==1){ this.n1(); } else if(n==2){ this.n2(); } } protected void n1() throws IOException{ //自選 Scanner c= new Scanner(System.in); System.out.print("請輸入組數:"); String s=br.readLine(); int n=Integer.parseInt(s); int A[][]=new int [n][6]; int v; for(int i=0;i<n;i++){ System.out.print("請輸入第"+(i+1)+"組(6數值):"); for(int j=0;j<6;j++){ v=c.nextInt(); A[i][j]=v; } } for(int i=0;i<n;i++){ Arrays.sort(A[i]); } LotoOutput(A,n); } protected void n2() throws IOException{ //隨機 System.out.print("請輸入組數:"); String s=br.readLine(); int n=Integer.parseInt(s); int A[][]=new int [n][6]; for(int i=0;i<n;i++){ for(int j=0;j<6;j++){ A[i][j]=(int)(Math.random()*num+1); } repeat(A,i); } for(int i=0;i<n;i++){ Arrays.sort(A[i]); } LotoOutput(A,n); } protected void repeat(int A[][],int a){ for(int i=0;i<6;i++){ for(int j=0;j<i;j++){ if(A[a][i]==A[a][j]){ A[a][i]=(int)(Math.random()*49+1); j=0; } } } } protected void LotoOutput(int A[][],int n){ for(int a=0;a<n;a++){ System.out.print("第"+(a+1)+"組:"); for(int b=0;b<6;b++){ System.out.print(A[a][b]+" "); } System.out.println(); } } } ``` 主程式:A9_3 ```java= import java.io.IOException; public class A9_3 { public static void main(String[] args) throws IOException { Loto L = new Loto(100); L.play(); } } ``` Output 範例一: 樂透數值範圍:1~100 [開始樂透游戲] 1.自選 2.隨機:1 請輸入組數:3 請輸入第1組(6數值):6 5 4 3 2 1 請輸入第2組(6數值):90 80 70 60 50 40 請輸入第3組(6數值):77 33 99 11 22 44 第1組:1 2 3 4 5 6 第2組:40 50 60 70 80 90 第3組:11 22 33 44 77 99 範例二: 樂透數值範圍:1~100 [開始樂透游戲] 1.自選 2.隨機:2 請輸入組數:5 第1組:17 33 51 67 70 91 第2組:7 24 32 36 72 73 第3組:10 88 92 93 96 99 第4組:9 31 36 55 75 87 第5組:13 28 55 61 66 70 ### 改寫(Overriding) 改寫(Overriding)是當子類別當中,有定義名稱、引數個數與型態均與父類別相同的method, 用以改寫父類別裡的method的功能 類別程式:Game(繼承Loto類別) ```java= import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Game extends Loto{ InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); public Game(int num) throws IOException{ super(num); play(); } public void play() throws IOException{ //Overriding Loto類別 System.out.print("[開始樂透游戲]\n 1.自選 、2.隨機、3.終極密``碼:"); String s=br.readLine(); int n=Integer.parseInt(s); switch (n){ //switch case 判斷 n值 case 1: this.n1(); break; case 2: this.n2(); break; case 3: this.PassWord(); break; } } public void PassWord() throws IOException{ //3.終極密碼 int A[]={1,100}; int p=(int)(Math.random()*100+1); int usr=0; System.out.println("[終極密碼]:電腦隨機產生1~100中的任意數字為答案,玩家答錯繼續,答對離開"); while(usr!=p){ System.out.print("請輸入大於"+A[0]+"小於"+A[1]+"的數字: "); String s=br.readLine(); usr=Integer.parseInt(s); if(usr == p){ System.out.println("答對啦! 答案就是"+p+",真是好運啊!"); } else if(usr<p && usr>A[0]){ A[0]=usr; System.out.println("Sorry,沒猜到 範圍在:"+A[0]+"到"+A[1]); } else if(usr>p && usr<A[1]){ A[1]=usr; System.out.println("Sorry,沒猜到 範圍在:"+A[0]+"到"+A[1]); } else{ System.out.println("請重新輸入!!"); } } } } ``` 主程式:A9_4 ```java= import java.io.IOException; public class A9_4 { public static void main(String[] args) throws IOException { new Game(100); } } ``` Output 範例一 : 樂透數值範圍:1~100 [開始樂透游戲] 1.自選 、2.隨機、3.終極密碼:3 [終極密碼]:電腦隨機產生1~100中的任意數字為答案,玩家答錯繼續,答對離開 請輸入大於1小於100的數字: 56 Sorry,沒猜到 範圍在:56到100 請輸入大於56小於100的數字: 78 Sorry,沒猜到 範圍在:78到100 請輸入大於78小於100的數字: 98 Sorry,沒猜到 範圍在:78到98 請輸入大於78小於98的數字: 78 請重新輸入!! 請輸入大於78小於98的數字: 89 Sorry,沒猜到 範圍在:78到89 請輸入大於78小於89的數字: 83 Sorry,沒猜到 範圍在:78到83 請輸入大於78小於83的數字: 80 答對啦! 答案就是80,真是好運啊! 範例二: 樂透數值範圍:1~100 [開始樂透游戲] 1.自選 、2.隨機、3.終極密碼:2 請輸入組數:3 第1組:10 23 39 42 48 91 第2組:8 39 42 44 48 58 第3組:5 20 34 54 65 75 ## CH10 ### 抽象類別 抽象類別是以 abstract 關鍵字為開頭的類別 abstract class 類別名稱{ //定義抽象類別 宣告資料成員; 回傳值資料型態 method 名稱(引數...) { //定義一般method } abstract 回傳值資料型態 method 名稱(引數..) //定義抽象method。抽象method裡,沒有定義處理的方式 } 抽象類別:HSBC (匯豐銀行) ```java= public abstract class HSBC { double 存款利率 = 0.001; double 借款利率 = 0.1; void 利率表(){ System.out.println("HSBC 利率表, 存款利率 = "+存款利率+" 借款利率 = "+借款利率 ); } abstract void 房貸業務(int m,double n); //定義抽象類別 abstract int 信貸業務(int m,double n); abstract void 車貸業務(int m,double n); } ``` 類別:TWHSBC(繼承HSBC) ```java= public class TWHSBC extends HSBC { @Override //改寫 void 房貸業務(int m, double n) { System.out.println("TWHSBC改寫房貸業務(), 房貸金額: "+m+" 房貸利率: "+n+"房貸利息: "+m*n); } @Override int 信貸業務(int m, double n) { System.out.println("TWHSBC改寫信貸業務(), 信貸金額: "+m+" 信貸利率: "+n+"信貸利息: "+m*n); return 0; } @Override void 車貸業務(int m, double n) { System.out.println("TWHSBC改寫車貸業務(), 車貸金額: "+m+" 車貸利率: "+n+"車貸利息: "+m*n); } } ``` 類別:JPHSBC(繼承HSBC) ```java= public class JPHSBC extends HSBC { @Override void 房貸業務(int m, double n) { System.out.println("JPHSBC改寫房貸業務(), 房貸金額: "+m+" 房貸利率: "+n+"房貸利息: "+m*n); } @Override int 信貸業務(int m, double n) { System.out.println("JPHSBC改寫信貸業務(), 信貸金額: "+m+" 信貸利率: "+n+"信貸利息: "+m*n); return 0; } @Override void 車貸業務(int m, double n) { System.out.println("JPHSBC改寫車貸業務(), 車貸金額: "+m+" 車貸利率: "+n+"車貸利息: "+m*n); } } ``` 主程式:A10_1 ```java= public class A10_1{ public static void main(String[] args) { TWHSBC TW = new TWHSBC(); TW.利率表(); TW.車貸業務(1000000, 0.098); JPHSBC JP = new JPHSBC(); JP.房貸業務(50000000, 0.077); //new.HSBC(); //不能生成抽象類別的物件 } } ``` Output HSBC 利率表, 存款利率 = 0.001 借款利率 = 0.1 TWHSBC改寫車貸業務(), 車貸金額: 1000000 車貸利率: 0.098車貸利息: 98000.0 JPHSBC改寫房貸業務(), 房貸金額: 50000000 房貸利率: 0.077房貸利息: 3850000.0 ### 介面(Interface) 介面本身也具有資料成員和抽象方法,但他與抽象類別有下列兩點不同: (1) 介面的資料成員必須初始化 (2) 介面裡的method 必須全部都宣告成abstract 介面不能像抽象類別一樣保有一般的method ,而必須全部都是 抽象方法 介面定義: interface 介面名稱 //定義抽象類別 { final 資料型態 成員名稱 = 常數; //資料成員必須設定初始值 abstract 回傳值得資料型態 method 名稱(引數...); //宣告抽象method 。 於抽象method 中,沒有定義處理方式 } ```java= public interface 國稅局 { //宣告介面名稱:國稅局 final double Tax= 0.05; //介面中宣告資料成員 abstract void 綜所稅(); //介面中宣告抽象類別 abstract void 營所稅(); } ``` ### 多重繼承 Java並「不」允許多個父類別繼承 但可藉由「介面」的機制,多重繼承的處理還是可以實現 其作法-- 將類別和兩個以上的介面實作在一起,其語法如下: class 類別名稱 implements 介面1,介面2,... //可實作兩個以上介面 { ... ... } ```java= public abstract class HSBC implements 國稅局{ //多重繼承可使用於抽象類別和類別中 public void 營所稅(){ //繼承類別 可改寫介面中的抽象類別,也可不改寫(不改寫則交由類別改寫) System.out.println("HSBC改寫國稅局營所稅()"); } } ``` 完整程式 介面1名稱:國稅局 ```java= public interface 國稅局 { //宣告介面名稱:國稅局 abstract void 綜所稅(); //介面中宣告抽象類別 abstract void 營所稅(); } ``` 介面2名稱:證交所 ```java= public interface 證交所 { //宣告介面名稱:證交所 abstract void 損益表(); //介面中宣告抽象類別 abstract void 盈餘表(); } ``` 介面3名稱:金管會 ```java= public interface 金管會 { //宣告介面名稱:金管會 abstract void 負債比(); //介面中宣告抽象類別 abstract void 逾放比(); abstract void 呆帳比(); } ``` 抽象類別名稱:HSBC ```java= public abstract class HSBC implements 國稅局{ double 存款利率 = 0.001; double 借款利率 = 0.1; void 利率表(){ System.out.println("HSBC 利率表, 存款利率 = "+存款利率+" 借款利率 = "+借款利率 ); } abstract void 房貸業務(int m,double n); abstract int 信貸業務(int m,double n); abstract void 車貸業務(int m,double n); public void 營所稅(){ //繼承類別 可改寫,也可不改寫 System.out.println("HSBC改寫國稅局營所稅()"); } } ``` 類別:TWHSBC ```java= public class TWHSBC extends HSBC implements 金管會,證交所{ @Override void 房貸業務(int m, double n) { System.out.println("TWHSBC改寫房貸業務(), 房貸金額: "+m+" 房貸利率: "+n+"房貸利息: "+m*n); } @Override int 信貸業務(int m, double n) { System.out.println("TWHSBC改寫信貸業務(), 信貸金額: "+m+" 信貸利率: "+n+"信貸利息: "+m*n); return 0; } @Override void 車貸業務(int m, double n) { System.out.println("TWHSBC改寫車貸業務(), 車貸金額: "+m+" 車貸利率: "+n+"車貸利息: "+m*n); } @Override public void 綜所稅() { // TODO Auto-generated method stub System.out.println("TWHSBC改寫國稅局綜所稅()"); } @Override public void 負債比() { // TODO Auto-generated method stub System.out.println("TWHSBC改寫金管會負債比()"); } @Override public void 逾放比() { // TODO Auto-generated method stub System.out.println("TWHSBC改寫金管會逾放比()"); } @Override public void 呆帳比() { // TODO Auto-generated method stub System.out.println("TWHSBC改寫金管會呆帳比()"); } @Override public void 損益表() { // TODO Auto-generated method stub System.out.println("TWHSBC改寫證交所損益比()"); } @Override public void 盈餘表() { // TODO Auto-generated method stub System.out.println("TWHSBC改寫證交所盈餘表()"); } } ``` 主程式:A10 ```java= public class A10 { public static void main(String[] args) { TWHSBC TW = new TWHSBC(); TW.利率表(); TW.車貸業務(1000000, 0.098); TW.營所稅(); TW.綜所稅(); TW.負債比(); TW.呆帳比(); TW.損益表(); TW.逾放比(); } } ``` Output HSBC 利率表, 存款利率 = 0.001 借款利率 = 0.1 TWHSBC改寫車貸業務(), 車貸金額: 1000000 車貸利率: 0.098車貸利息: 98000.0 HSBC改寫國稅局營所稅() TWHSBC改寫國稅局綜所稅() TWHSBC改寫金管會負債比() TWHSBC改寫金管會呆帳比() TWHSBC改寫證交所損益比() TWHSBC改寫金管會逾放比() ## CH11 ### 檔案的分割(package) 開發大型程式時,可利用當按分割的方式,將程式分開成獨立的類別, 以利於程式的開發與維護 package 基本概念: package是使用多個類別或介面時,避免名稱重復而採用的一種措施。 package 使用方法: 在類別或介面最上面一行加上package 的宣告就可以 語法: package package名稱; 建立一個資料夾:Gjun(資料夾中放CCircle、CCoin、A11) 類別: CCircle ```java= package Gjun; //package名稱需與資料夾名稱相同(Gjun) public class CCircle{ double pi = 3.14; double radius = 2.0; CCircle (){ //建構元 double pi = 3.14; double radius = 2.0; System.out.println("父0.CCircle()建構元, pi="+pi+" radius="+radius); show(); } CCircle (double r){ //建構元 double pi = 3.14; double radius = r; System.out.println("父1.CCircle(double)建構元, pi="+pi+" radius="+radius); } public void show(){ System.out.println("父 CCircle show(), pi="+pi+" radius="+radius+" area="+radius*radius*pi); } } ``` 類別: CCoin ```java= package Gjun; //package名稱需與資料夾名稱相同(Gjun) public class CCoin extends Taipei.CCircle{ int value; CCoin(){ //建構元 value = 10; System.out.println("子0.CCoin()建構元, pi="+pi+" radius="+radius+" value="+value); setvalue(value); } CCoin(double v){ //建構元 super(v); //呼叫父類別相同類型建構元 value = (int)v; System.out.println("子0.CCoin()建構元, pi="+pi+" radius="+radius+" value="+value); setvalue(value); } void setvalue(int v){ value = v; System.out.println("子 CCoin setvalue(int), value="+value); } public void show(){ System.out.println("子 CCircle show(), pi="+pi+" radius="+radius+" value="+value); } } ``` 主程式:A11_1 ```java= package Gjun; //package名稱需與資料夾名稱相同(Gjun) public class A11_1{ public static void main(String[] args) { Taipei.CCircle c1 = new Taipei.CCircle(); c1.show(); Hsinchu.CCoin c2 = new Hsinchu.CCoin(); c2.setvalue(5); c2.show(); Taipei.CCircle c3 = new Hsinchu.CCoin(8.0); c3.show(); } } ``` Output(編譯、執譯) 命令提示字元(cmd)內容: C:\Java\作品>javac Gjun\CCircle.java C:\Java\作品>javac Gjun\CCoin.java C:\Java\作品>javac Gjun\A11.java C:\Java\作品>java Gjun.A11 父0.CCircle()建構元, pi=3.14 radius=2.0 父 CCircle show(), pi=3.14 radius=2.0 area=12.56 父 CCircle show(), pi=3.14 radius=2.0 area=12.56 父0.CCircle()建構元, pi=3.14 radius=2.0 子 CCircle show(), pi=3.14 radius=2.0 value=0 子0.CCoin()建構元, pi=3.14 radius=2.0 value=10 子 CCoin setvalue(int), value=10 子 CCoin setvalue(int), value=5 子 CCircle show(), pi=3.14 radius=2.0 value=5 父1.CCircle(double)建構元, pi=3.14 radius=8.0 子0.CCoin()建構元, pi=3.14 radius=2.0 value=8 子 CCoin setvalue(int), value=8 子 CCircle show(), pi=3.14 radius=2.0 value=8 ### 不同 package 中存取 如果數個類別分別屬於不同的package時,在某個類別要存取到其他類別的成員時,必須做下類修改: (1)若某個類別需要被存取時,必須把這個類別公開(public) (2)若要存取不同package內某個public 類別的成員時,在程式碼內部必須明確指明「被存取的package的名稱.類別名稱」 (3)須注意成員權限(Field、method、constructor) 資料夾:Tapei 類別名稱:CCircle ```java= package Taipei; //package 宣告要放在第一行(不含註解) public class CCircle{ protected double pi = 3.14; //宣告權限為protected,供CCoin類別使用 protected double radius = 2.0; //宣告權限為protected,供CCoin類別使用 public CCircle (){ //須公開(跨package)//建構元 double pi = 3.14; double radius = 2.0; System.out.println("父0.CCircle()建構元, pi="+pi+" radius="+radius); show(); } public CCircle (double r){ //須公開(跨package)//建構元 double pi = 3.14; double radius = r; System.out.println("父1.CCircle(double)建構元, pi="+pi+" radius="+radius); } public void show(){ //須公開(跨package) System.out.println("父 CCircle show(), pi="+pi+" radius="+radius+" area="+radius*radius*pi); } } ``` 資料夾:Hsinchu 類別名稱:CCoin ```java= package Hsinchu; //package 宣告要放在第一行(不含註解) import Taipei.CCircle; //匯入Taipei 資料庫(其中一處) public class CCoin extends Taipei.CCircle{ //匯入Taipei 資料庫(其中一處) int value; public CCoin(){ //須公開(跨package)//建構元 value = 10; System.out.println("子0.CCoin()建構元, pi="+pi+" radius="+radius+" value="+value); setvalue(value); } public CCoin(double v){ //須公開(跨package)//建構元 super(v); //呼叫父類別相同類型建構元 value = (int)v; System.out.println("子0.CCoin()建構元, pi="+pi+" radius="+radius+" value="+value); setvalue(value); } public void setvalue(int v){ //須公開(跨package) value = v; System.out.println("子 CCoin setvalue(int), value="+value); } public void show(){ //須公開(跨package) System.out.println("子 CCircle show(), pi="+pi+" radius="+radius+" value="+value); } } ``` 資料夾:Gjun 類別名稱:A11_2 ```java= package Gjun; //package名稱需與資料夾名稱相同(Gjun) import Taipei.CCircle; //可先匯入資料庫(Taipei、Hsinchu) import Hsinchu.*; //"*"可匯入資料庫中所有類別 public class A11_2{ public static void main(String[] args) { CCircle c1 = new CCircle(); c1.show(); CCoin c2 = new CCoin(); c2.setvalue(5); c2.show(); CCircle c3 = new CCoin(8.0); c3.show(); } } ``` Output 父0.CCircle()建構元, pi=3.14 radius=2.0 父 CCircle show(), pi=3.14 radius=2.0 area=12.56 父 CCircle show(), pi=3.14 radius=2.0 area=12.56 父0.CCircle()建構元, pi=3.14 radius=2.0 子 CCircle show(), pi=3.14 radius=2.0 value=0 子0.CCoin()建構元, pi=3.14 radius=2.0 value=10 子 CCoin setvalue(int), value=10 子 CCoin setvalue(int), value=5 子 CCircle show(), pi=3.14 radius=2.0 value=5 父1.CCircle(double)建構元, pi=3.14 radius=8.0 子0.CCoin()建構元, pi=3.14 radius=2.0 value=8 子 CCoin setvalue(int), value=8 子 CCircle show(), pi=3.14 radius=2.0 value=8