前面寫著class的,是類別。
類別裡面有屬性跟方法。
屬性是一些直接定義出來的變數,例如一個名字叫a的整數型態資料,剛開始時設定他是5,整體寫來如下:
int a = 5;
↑這就是屬性,你之後若是把a叫出來,他就會是等於可以做加減運算的整數數字5。
方法就是裡面有些算是或者有些東西,你叫了方法就好像是拿了一個工具一樣。例如有個方法,呼叫他時可能就會列印「你好」,就好像是拿到一個會自己說話的工具。又或者有的方法是可以幫你計算兩個數字相加之類的,就像是拿到一台只會加法的計算機。
class是一個類別,裡面會裝著各種屬性跟方法,就像一個裝著各種用具跟資料的工具箱一樣,你呼叫他就像是把工具箱拿出來,但你要使用的是工具(方法、屬性),而不是那個箱子。
又或者可以把類別視為一個總稱,例如人類。
屬性就是人類的特性,例如兩條腿、兩顆眼睛。
方法就是人類可以做的事情,例如吃喝玩樂跑步睡覺。
但你無法叫「人類」去做事情,只能叫「個人」去做事情,這個「個人」就是實體化(new)
也就是你希望有人幫你做事情時,你得先生出一個人(實體),然後才能叫他去幫你做事情。(對電腦來說則是撥出一塊記憶體放東西)
而這個「呼叫」(產生實體)的方式如下:
Human mike = new Human();
等號的右邊new Human字如其意「產生一個新的人類(實體)」
等號的左邊幫這個新生出來的人類取名字:(把右邊產生的人類)取名叫mike,並且告訴電腦這傢伙的類別是人類(這部分就像上面舉的a一樣,你得告訴電腦a是一個整數,也得告訴他mike是個人類)
於是電腦知道mike是人類了,就可以去人類的類別裡看看人類會做甚麼事情、有甚麼特點(方法跟屬性)
package tw.xxx.xxx.copy.oop;
public class Order {
//看到關鍵字class,所以Order是一個類別,底下可以放屬性跟方法
//現在有一大疊訂購單在那,要等我真的要用到時才會抽出一張來用(實體化)
long orderNumber= 123456789000000L;//這是一個屬性,是一個很長的數字,所已宣告形態不是int而是long,之後你如果有Order的實體就可以用他
public void add(){//這是一個方法,你之後若叫出一個Order的實體(拿出一張真正的訂購單),就可以叫出這個方法(加東西到訂單裡),他會列印以下文字
System.out.println("加入新東西到購物單裡,騙你的。");
}
public void delete(){//這也是一個之後可以呼叫的方法(把訂單裡的東西刪除),會列印文字
System.out.println("刪除購物單裡的舊東西,騙你的。");
}
public static void main(String[] args) {
Order myOrder = new Order();
//(等號左邊)產生了一個真正的、屬於你的訂單
//(等號右邊)你幫訂單取了一個名字叫myOrder,並且告訴電腦myOrder這個東西是個訂單
//於是電腦知道你有訂單,有add跟delete兩個方法,且還有一個訂單號碼orderNumber(屬性)
myOrder.add();
myOrder.delete();
//利用(變數)名稱.方法來呼叫方法
for(int i=0;i<5;i++){
System.out.println(myOrder.orderNumber+i);//一樣用「名稱.屬性」的方式來把數字叫出來,並做出計算
}
}
}
加入新東西到購物單裡,騙你的。
刪除購物單裡的舊東西,騙你的。
123456789000000
123456789000001
123456789000002
123456789000003
123456789000004
static 是一種類別變數(也叫靜態變數),他雖然長在類別裡,但是從一出生就被分配好記憶體了,也就是一出生就有實體了,所以不需要先new再操作
但是還是得讓電腦知道他哪來的,所以使用方式是「類別名稱 . 方法」或者「類別名稱 . 屬性」
package tw.xxx.xxx.copy.oop;
class TestForStatic{
static int num=123;//可以直接使用的屬性
static void printString(){//可以直接使用的方法
System.out.println("呼叫成功");
}
}
public class CallTestStaticEx1 {
public static void main(String[] args) {
System.out.println(TestForStatic.num);//可以直接用類別.屬性名稱呼叫
TestForStatic.printString();//同上
}
}
123
呼叫成功
變數(屬性)有分幾種,
一種在類別裡但不在方法裡,稱為實體變數,跟類別共存亡,類別被new了他才會出現
一種是靜態變數(類別變數)如上面的例子,你把它寫下來時他就有記憶體可以放了,所以可以直接叫他,同樣的也有不用new就存在的靜態方法,關鍵字是static
上面兩種都屬於全域變數。
還有一種變數存在在方法裡,你new類別時他不在,你把呼叫方法時他才出現,並且跟方法共存亡,他叫區域變數
package tw.XXX.myfirstproject.oop;
public class TestVariableScopeEx1 {
int a=1;//instance(實體變數),位於類別之下,方法之上
//變數 跟物件一起(有new才行產生,所以得先=new TestVariableScopeEx1才能用a)
static int b=2;//static變數 跟class一起,屬於類別非物件(不用先用new,可直接使用b)
public void f1(int c){//c為local變數,跟方法f1一起出現一起消失
int d=4;//d為local變數,跟方法一起出現一起消失
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);
System.out.println("d="+d);
System.out.println("---------以上屬於f1方法--------");
}
public static void f2(int e){
//注意這行有static,上面f1沒有,所以f2這個方法可以直接使用,f1不行(f1要new,產生實體)
//System.out.println("a="+a);//a為實體變數,要new過才能用,但f2可以直接使用,所以會compile error
System.out.println("b="+b);
//System.out.println("c="+c);//compile error c跟d為f1的區域變數,無法使用
//System.out.println("d="+d);//compile error
System.out.println(e);
System.out.println("---------以上屬於f2方法---------");
}
public static void main(String[] args) {
f2(6);//f2是類別變數,可直接使用
//f2是static變數,不需要先呼叫,但f1就需要
TestVariableScopeEx1 scope=new TestVariableScopeEx1();
//呼叫,產生實體
scope.f1(3);
scope.f2(5);//其實這樣叫f2也行,但是電腦會警告(?)
TestVariableScopeEx1.f2(6);//f2也可以用類別名稱來呼叫
}
}
b=2
6
---------以上屬於f2方法---------f2(6)
a=1
b=2
c=3
d=4
---------以上屬於f1方法--------scope.f1(3)
b=2
5
---------以上屬於f2方法---------f2(5)
b=2
6
---------以上屬於f2方法---------TestVariableScopeEx1.f(6)