if...else
if( 判斷式 ){
....
}
else if( 判斷式2 ){
...
}
else{
...
}
- 有些時候用if裡面包好幾層if會使得程式碼難以閱讀,記得一定要使用else if
switch case
switch( 判斷變數 ){
case 變數值1:
...
break;
case 變數值2:
...
break;
default:
break;
}
記得case後面接的是 變數的值,如果變數是string類別,那就應該寫成 case "...."
兩大要素絕對不能忘:default、break
for Loop
for( Variable宣告 ; BooleanStatement ; UpdateStatement){
....
}
- ( )中三個條件不一定每個都要寫,但還是要用;來分隔
- 變數宣告盡量不要寫在loop內,這樣每跑一圈都會重新宣告一次
- 只列出一排時可以想像是用單層迴圈,列印出n*n的形狀可以想像是用雙層迴圈
- 當 跑幾圈 很明確時,請用for迴圈
while Loop
//通常此處會有 變數宣告
while( BooleanStatement ){
....
//通常此處會有 變數遞增程式碼
}
- 記住while就是將for( )裡的三樣,分開寫好,一樣都不能漏!
- while ( )裡的布林判斷式,寫的是持續執行條件,而非結束條件
- 當你 不知道要讓迴圈跑幾圈 時,請用while迴圈
全域 及 區域變數
public class MainClass{
private int GlobalVariable;
public static void main(String[] args){
private int LocalVariable;
}
}
- 全域變數:放置在最靠近class宣告的那一層,class裡都可以使用這個變數
- 區域變數:放置在函數或是迴圈裡,只有在包住他最近的{ }範圍裡才可以使用
static 及 final
final double PI=3.14;
static int i=1;
- static變數函數打從程式執行記憶體位置就存在,只到程式結束後才會消失
- final變數需在宣告時就設定初值,一旦設定初值則不能更改
- 注意static function,若要使用不在funtcion內的變數,一定得是static變數
public class MainClass {
int i=1;
public static void f(){
System.out.println(i);
}
}
Recursive
function Recur_fun(){
if ( 終止條件 )
return ...
else
return 呼叫自己
}
- 遞迴的兩大要素就是 1)終止條件 2)呼叫自己,兩者缺一不可
遞迴要思考我們知道的條件跟不知道的狀況
ex.求10!,我們知道1!是什麼,所以他就是終止條件
我們不知道2!~10!的值是什麼,所以就要用呼叫自己來處理遞迴撰寫時應寫出遞迴執行過程,如以下
sum(4)=4*4+sum(3) =16+14=30
sum(3)=3*3+sum(2) =9+5=14
sum(2)=2*2+sum(1) =5
sum(1)=1
Method
呼叫物件的函數
ObjectName.functionName( parameter );
呼叫自己class內的函數
functionName( parameter );
- 函數返回值只要不是void,就必須 使用 或是 建一個變數接收他的回傳值
傳值呼叫 與 傳參考呼叫 要分清楚
基本型態->傳值呼叫
非基本型態->傳參考呼叫使用不限長度的參數
(型態... 參數名稱)
Array
int[] score=new int[5];
int[][] score=new int[3][5];
int[] score={99,98,63};
int[][] score={{98,59},{63,87,92}};
- 記得宣告多維陣列時,有幾維,就要有幾層的{ }
- Array.length求出陣列的長度
- 陣列第一個起始值是0
- 使用for迴圈列出陣列的值,幾維陣列就要用幾層for迴圈,以下示範二維陣列
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
....
}
}
foreach
for(type ElementName : ArrayName){
.....
}
- foreach在存取多維陣列的時候特別需要注意
for(int[] i : array){
for(int j : i){
...
}
}
記住for迴圈的 i、j 是index,但是foreach迴圈的 i、j 是值本身
: 前型態需特別注意,:後都不需要加上[ ] 只要打出變數名字即可
Class & Object
public class Car {
private String name; //屬性
public Car(){ //建構子
....
}
public parkingCar(){//方法
....
}
}
- 三大要素構成一個class:建構子、屬性(變數)、方法
- class分成一般class、abstract class、final class
- 屬性建議都設成private,已保持它的封裝性
//PURPOSE:建立物件及使用方法、變數
Car taxi=new Car(); //此時建構子被呼叫
taxi.name="小黃"; //此時是假設taxi是public的狀況才可以這樣使用
taxi.parkingCar();
Constructor
public class Car {
public Car(){
.....
}
public Car(String n){
.....
}
}
名字及modifier皆需與class相同,沒有回傳值
永遠放在最上面
在物件被建立時即刻被呼叫
建議若撰寫了有參數的建構子,也應將沒有任何參數傳入的建構子寫上去
若想要呼叫自己class的建構子時,用this(...)
若想要呼叫父類別的建構子時,用super(...),不選擇的話會呼叫預設建構子
Overload
int sum(int a,int b,int c);
int sum(int a);
當我們要讓函數作同樣的一件事,但是參數型態或是數量不同時,我們就會使用overload
- 函數名稱相同
- 參數型態 必須長得不一樣
Modifier
public公開
字面意思上就可以看出,無論任何人都可以進行存取。protected
只要是自己或自己的子類別都可以存取,無論在不在同個資料夾。private
只有自己這個類別本身的成員可以存取,常用於封裝no modifier(預設)
又稱為package權限,只要在同一package下都可以存取到
封裝
什麼時候會用到封裝?例如我們希望一個變數,要透過我們規定的方法才可以更改,不能允許其他人隨意更改他的值,這時候我們就會用到封裝了
繼承
class [ClassName] extends [SuperClass]
- 要搞清楚class、subclass、object之間的關係,不能混淆
- 子類別會擁有父類別所有的變數及function,包括private的也會有,只是不能更改它而已
多型
- 運用override就可以有多型的效果
- 思考一下何時會需要用到多型? 當我們都要使用父類別繼承下來的function,但又想要做點更動的時候,就可以使用override
- 標記 @Override 是個好習慣
- 要呼叫父類別裡那個沒有被override的舊function,要使用
super.functionName( parameter );
- 不想被override的function,要設成final
Static function
ClassName.FunctionName(...);
非static的function呼叫請用
ObjectName.functionName(...);
Abstract Class
public abstract class Shape {
private String name;
public abstract doubleGetArea();
public abstract doubleGetPerimeter();
}
- 只要有一個abstract funtcion就是abstract class
- abstract function不需要加{ }更不需要寫出函數執行內容,但是函數名稱後的( )還是得加
- 繼承至abstract class的class,若沒有將abstract function都實作出來,子類別還是得是abstract function,若將所有的abstract function都實作出來,子類別才可以成為一般類別