# 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