1、面向?qū)ο蟾攀?/h2>
1.1 對象
在現(xiàn)實世界中嗤堰,對象是事物存在的實體戴质。而在計算機的世界中,面向?qū)ο蟪绦蛟O(shè)計的思想要以對象來思考問題梁棠,首先將現(xiàn)實世界的實體抽象為對象置森,然后考慮這個對象具備的屬性和行為。
舉個例子來說符糊,如果有一只大雁要從北方飛往南方這個實際問題凫海,我們首先可以從這一問題中抽象出大雁這個對象,然后識別出大雁的屬性男娄,比如有一對翅膀行贪,有黑色的羽毛等等。隨后模闲,我們可以識別出這個對象的動態(tài)行為建瘫,即這只大雁可以進行的動作,比如飛行尸折、覓食等啰脚,這些動作都是這個對象基于其屬性而具有的動作。
1.2 類
類是同一類事物的統(tǒng)稱实夹,如果將現(xiàn)實世界中的一個事物抽象成對象橄浓,類就是這類對象的統(tǒng)稱粒梦,比如鳥類,家禽類等等荸实。具有相同特征和行為的一類事物就稱為類匀们。
類與對象的關(guān)系可以如下來描述:類是世間事物的抽象稱呼,而對象則是這個事物相對應(yīng)的實體准给。
1.3 面向?qū)ο蟪绦蛟O(shè)計的特點
封裝
封裝是面向?qū)ο缶幊痰暮诵乃枷胄蛊樱瑢ο蟮膶傩院托袨榉庋b起來,其載體就是類露氮,類通常對客戶隱藏其實現(xiàn)細節(jié)祖灰,這就是封裝的思想。
類為用戶提供對象的屬性和行為的接口沦辙,用戶通過這些接口使用這些類夫植,無須知道這些類內(nèi)部是如何構(gòu)成的,不能操作類中的內(nèi)部數(shù)據(jù)油讯。
繼承
類與類之間同樣具有關(guān)系详民,繼承是關(guān)聯(lián)中的一種。舉例來說陌兑,四邊形中有平行四邊形沈跨,梯形等等,平行四邊形具有四邊形的所有性質(zhì)兔综,比如有四條邊饿凛,內(nèi)角和為360度等等,但是软驰,平行四邊形也有普通四邊形所不具備的特殊性質(zhì)涧窒,比如兩組對邊平行等等。 在JAVA中锭亏,我們將類似于平行四邊形的類稱為子類纠吴,將類似于四邊形的類稱為父類或者超類。
多態(tài)
多態(tài)(Polymorphism)按字面的意思就是“多種狀態(tài)”慧瘤。在面向?qū)ο蟮恼Z言中中戴已,接口的多種不同的實現(xiàn)方式即為多態(tài)。比如四邊形有繪制圖像的能力锅减,但是繪制怎樣的四邊形是不確定的糖儡,對于正方形,我們要繪制四條邊相等的圖形怔匣,對于平行四邊形握联,我們要繪制兩組對邊互相平行的圖形。在多態(tài)的機制中,父類通常被定義為抽象類并給出一個方法的標(biāo)準(zhǔn)拴疤,而不給出實現(xiàn)的具體流程永部。
2独泞、類與對象
在JAVA中定義類使用class關(guān)鍵字呐矾,其語法如下
class 類名稱{
//成員變量
// 成員方法
}
我們直接用一個簡單的例子來介紹一下類的一些基本元素
public class Basic_oop {
public int x = 100;
public int y = 100;
public int getX(){
return this.x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getSum(int x,int y){
return x + y;
}
public void change(int[] x){
for(int i=0;i<x.length;i++) {
x[i] = 100 * i;
}
}
public int getSum(int... x){
int sum = 0;
for(int i=0;i<x.length;i++){
sum += x[i];
}
return sum;
}
public Basic_oop(){
}
public Basic_oop(int x,int y){
this.x = x;
this.y = y;
}
public static void main(String[] args){
Basic_oop obj = new Basic_oop(5,4);
System.out.println(obj.x);
System.out.println(obj.y);
int[] arr = new int[]{0,1,2};
obj.change(arr);
for(int i:arr){
System.out.print(i + "\t");
}
}
}
成員變量
成員變量即對象的屬性,可以看到懦砂,我們建立了一個Basic_oop的類蜒犯,類的對象有兩個屬性,或者說是兩個成員變量荞膘,分別是x和y罚随。
成員方法
成員方法即類對象的行為,我們定義了獲得屬性值和設(shè)置屬性值的set和get方法羽资。同時淘菩,為了介紹成員方法的參數(shù)的概念,我們定義了兩個getSum方法和一個change方法屠升。那么在成員方法中傳遞參數(shù)潮改,有三種方式。
(1)值參數(shù)
值參數(shù)表明實參與形參之間按值傳遞腹暖,因此對形參的修改不會引起實參的變化
(2)引用參數(shù)
如果在給方法傳遞參數(shù)時汇在,參數(shù)的類型是數(shù)組或者其他引用類型,那么在方法中對參數(shù)的修改會反映到原有的數(shù)組或者其他引用類型上脏答,這種類型的方法參數(shù)糕殉,稱為引用參數(shù)。如上面的例子中殖告,change方法修改了原來數(shù)組中的三個值阿蝶,變成了0、100和200黄绩,那么打印將輸出0羡洁、100和200。
(3)不定長參數(shù)
聲明方法時宝与,如果有若干個相同類型的參數(shù)焚廊,可以定義為不定長參數(shù),在參數(shù)類型和參數(shù)名之間有三個點即可习劫。比如上例中的第二個getSum方法咆瘟。
構(gòu)造方法
構(gòu)造方法是一個與類同名的方法,對象的創(chuàng)建就是通過構(gòu)造方法完成的诽里。對于構(gòu)造方法來說袒餐,它沒有返回值,名稱必須要與被類的名稱相同,在默認(rèn)情況下灸眼,構(gòu)造方法是沒有參數(shù)的卧檐,當(dāng)然我們也可以創(chuàng)建有參的構(gòu)造方法,來完成對對象的參數(shù)的初始化焰宣。如
public Basic_oop(int x,int y){
this.x = x;
this.y = y;
}
** 對象的創(chuàng)建**
對象的創(chuàng)建使用new關(guān)鍵字霉囚,如果不傳入?yún)?shù),將調(diào)用默認(rèn)的無參構(gòu)造函數(shù)創(chuàng)建匕积,如果帶參數(shù)盈罐,則使用有參的構(gòu)造函數(shù)創(chuàng)建:
Basic_oop obj = new Basic_oop(5,4);
訪問對象的屬性和行為
可以使用對象.類成員來獲取對象的屬性和行為。比如:
System.out.println(obj.x);
System.out.println(obj.y);
int[] arr = new int[]{0,1,2};
obj.change(arr);
對象的銷毀
JAVA擁有一套完整的垃圾回收機制闪唆,Java虛擬機會回收無用的但占用內(nèi)存的資源盅粪。那么那種對象會被Java虛擬機視為垃圾呢?主要有以下兩種:
1悄蕾、對象引用超過其作用范圍票顾;
2、將對象賦值為null帆调。
但垃圾回收器只能回收由new操作符創(chuàng)建的對象奠骄。
this關(guān)鍵字
JAVA語言中,this關(guān)鍵字被用來代替本類對象的引用贷帮。
3戚揭、static關(guān)鍵字
由static修飾的變量,常量和方法被稱為靜態(tài)變量撵枢、靜態(tài)常量和靜態(tài)方法民晒,也被稱為類的靜態(tài)成員。我們先來看一個例子:
public class Basic_oop_static {
static public int water = 0;
final static int inPerTime = 3;
final static int outPerTime = 2;
public void outlet(){//放水锄禽,一次兩個單位
if(water > outPerTime){
water -= outPerTime;
}
else{
water = 0;
}
}
public void inlet(){//注水潜必,一次3個單位
water += inPerTime;
}
static public int printWater(){
return water;
}
public static void main(String[] args){
Basic_oop_static in = new Basic_oop_static();
Basic_oop_static out = new Basic_oop_static();
System.out.println("水池的水量"+Basic_oop_static.water);
System.out.println("水池注水兩次");
in.inlet();
in.inlet();
System.out.println("水池的水量"+Basic_oop_static.water);
System.out.println("水池放水兩次");
out.outlet();
out.outlet();
System.out.println("水池的水量"+Basic_oop_static.printWater());
}
}
輸出為:
水池的水量0
水池注水兩次
水池的水量6
水池放水兩次
水池的水量2
3.1 靜態(tài)變量
如果想讓同一類的不同實例對象共享同一個變量,那么可以將該變量定義為靜態(tài)變量沃但,如上面的water對象磁滚,類中不同對象對靜態(tài)變量的修改,都會作用到其他該類的對象中宵晚,比如我們修改水池的水量垂攘,可以發(fā)現(xiàn)water變量是兩個對象所共享的。
3.2 靜態(tài)常量
由final static修飾的成員變量即為靜態(tài)常量淤刃,靜態(tài)常量由類的所有對象所共享晒他,且不能被改變:
final static int inPerTime = 3;
final static int outPerTime = 2;
3.3 靜態(tài)方法
調(diào)用靜態(tài)方法,無需創(chuàng)建類的對象逸贾,直接用 ** 類名.靜態(tài)方法() ** 調(diào)用即可陨仅。
Basic_oop_static.printWater();
3.4 靜態(tài)代碼塊
staitc修飾的代碼區(qū)域可以被稱之為靜態(tài)代碼塊津滞。
1、靜態(tài)代碼塊自始至終只運行一次灼伤,聲明一個對象的時候就會運行靜態(tài)代碼塊
2触徐、非靜態(tài)代碼塊每次創(chuàng)建對象時都會運行,并且會在構(gòu)造方法之前云行
3狐赡、構(gòu)造方法只有在使用new創(chuàng)建對象時才會運行
4撞鹉、成員方法只有在使用對象調(diào)用時才會運行
我們來看一個例子:
public class StaticTest {
static String name;
static{
System.out.println(name + "靜態(tài)代碼塊");
}
{
System.out.println(name + "非靜態(tài)代碼塊");
}
public StaticTest(String a){
name = a;
System.out.println(name + "構(gòu)造方法");
}
public void method(){
System.out.println(name + "成員方法");
}
public static void main(String[] args){
StaticTest s1;
StaticTest s2 = new StaticTest("s2");
StaticTest s3 = new StaticTest("s3");
s3.method();
}
}
輸出為:
null靜態(tài)代碼塊
null非靜態(tài)代碼塊
s2構(gòu)造方法
s2非靜態(tài)代碼塊
s3構(gòu)造方法
s3成員方法
由于聲明就會調(diào)用靜態(tài)代碼塊,而String的默認(rèn)值為null猾警,所以首先輸出 null靜態(tài)代碼塊孔祸,由于每次調(diào)用new來構(gòu)造對象,都會首先調(diào)用非靜態(tài)代碼塊发皿,然后執(zhí)行構(gòu)造方法,所以接連輸出:null非靜態(tài)代碼塊拂蝎、s2構(gòu)造方法穴墅、s2非靜態(tài)代碼塊、s3構(gòu)造方法温自。由于成員方法只有在對象調(diào)用時才會執(zhí)行玄货,所以最后輸出:s3成員方法。