Java 筆記01
麵向對象主要針對麵向過程。
麵向過程的基本單元是函數。
什麼是對象:EVERYTHING IS OBJECT(萬物皆對象)
所有的事物都有兩個方麵:
有什麼(屬性):用來描述對象。
能夠做什麼(方法):告訴外界對象有那些功能。
後者以前者為基礎。
大的對象的屬性也可以是一個對象。
為什麼要使用麵向對象:
首先,麵向對象符合人類看待事物的一般規律。
對象的方法的實現細節是屏蔽的,隻有對象方法的實現者了解細節。
方法的定義非常重要。方法有參數,也可能有返回值。
注意區分:對象(本身)、對象的實現者、對象的調用者。
分析對象主要從方法開始。
我們通過類來看待對象,類是對象的抽象。
其次,采用麵向對象方法可以使係統各部分各司其職、各盡所能。
對象之間的耦合性一定要低(比如不同硬盤和不同主板之間的關係)。這樣才能使每個對象本身做成最好的。
對於對象的要求:高內聚、低耦合,這樣容易拚裝成為一個係統。
實現高內聚就是要最大限度低提高複用性(複用性好是因為高內聚)。
可複用性是OOP的基礎。
比較麵向過程的思想和麵向對象的思想:
麵向過程的思想:由過程、步驟、函數組成,以過程為核心;
麵向對象的思想:以對象為中心,先開發類,得到對象,通過對象之間相互通信實現功能。
麵向過程是先有算法,後有數據結構。
麵向對象是先有數據結構,然後再有算法。
在用麵向對象思想開發的過程中,可以複用對象就進行複用,如無法進行複用則開發新的對象。
開發過程是用對個簡單的對象的多個簡單的方法,來實現複雜的功能 。
從語法上來看,一個類是一個新的數據類型。
在麵向對象編程中,除了簡單數據類型,就是對象類型。
定義類的格式:
class Student{
代碼
}
注意類名中單詞的首字母大寫。
實例變量:定義在類中但在任何方法之外。(New出來的均有初值)
局部變量:定義在方法之中的變量。
局部變量要先賦值,再進行運算,而實例變量均已經賦初值。這是局部變量和實例變量的一大區別。
實例變量的對象賦值為null。
局部變量不允許範圍內定義兩個同名變量。實例變量的作用域在本類中完全有效,當被其他的類調用的時候也可能有效。
實例變量和局部變量允許命名衝突。
書寫方法的格式:
修飾符 返回值 方法名 調用過程中 方法體
可能出現的例外
public int/void addNumber(參數) throwExcepion {}
例:
public int addNumber(int a,int b){
}
注:方法名中的參數int a,int b為局部變量
類方法中的一類特殊方法:構造方法。
構造方法是當用類生成對象時,係統在生成對象的過程中利用的方法。
注意:構造方法在生成對象的時候會被調用,但並不是構造方法生成了對象。
構造方法沒有返回值。格式為:public 方法名。
構造方法的方法名與類名相同。
構造方法是在對象生成的過程中自動調用,不可能利用指令去調用。
在一個對象的生成周期中構造方法隻用一次,一旦這個對象生成,那麼這個構造方法失效。
用類來生成對象的語句:
Student s=new Student()。
第一個Student表示這是用Student類進行定義。“Student()”表示調用一個無參數的構造方法。
如果()中有參數,則係統構造對象的過程中調用有參的方法。
此時S稱為一個對象變量。
Student s的存儲區域存放的是地址:一個對象在硬盤上占有一個連續地址,首地址賦予s空間。
S稱為對象Student的引用。
注意:在對象變量中存放的是引用(地址);在簡單變量中存放的是數值。
可以構造多個構造方法,但多個構造方法的參數表一定不同,參數順序不同即屬於不同的構造方法:
publicstudent(string name,int a){
}
public student(inta,string name){
}
為兩個不同的構造方法。
如果我們未給係統提供一個構造方法,那麼係統會自動提供一個為空的構造方法。
練習:寫一個類,定義一個對象,定義兩個構造方法:一個有參,一個無參。
(編寫一個程序驗證對象的傳遞的值為地址)
注意下麵這種形式:
static voidchangename(student stu){stu.setName “LUCY”}
注意生成新的對象與舊對象指向無關,生成新對象生命消亡與舊對象無關。
麵向對象方法的重載(overloading)和覆蓋(overriding)。
在有些JAVA書籍中將overriding稱為重載,overloading稱為過載。
Overloading在一個類中可以定義多個同名方法,各個方法的參數表一定不同。但修飾詞可能相同,返回值也可能相同。
在程序的編譯過程中根據變量類型來找相應的方法。因此也有人認為 overloading是編譯時的多態,以後我們還會學到運行時多態。
為什麼會存在overloading技術呢?作為應對方法的細節。
利用類型的差異來影響對方法的調用。
吃()可以分為吃肉,吃菜,吃藥,在一個類中可以定義多個吃方法。
構造方法也可以實現overloading。例:
public void teach(){};
public void teach(int a){};
public void teach(String a){}為三種不同的方法。
Overloading方法是從低向高轉。
Byte—short—float—int—long—double。
在構造方法中,this表示本類的其他構造方法:
student(){};
student(stringn){
this();//表示調用student()
}
如果調用student(int a)則為this(int a)。
特別注意:用this調用其他構造方法時,this必須為第一條語句,然後才是其他語句。
This表示當前對象。
Public void printNum(){
Int number=40;
System.out.println(this.number);
}
此時打印的是實例變量,而非局部變量,即定義在類中而非方法中的變量。
This.number表示實例變量。
誰調用this.number那麼誰即為當前(this)對象的number方法。
封裝:使對象的屬性盡可能私有,對象的方法盡可能的公開。用private表示此成員屬性為該類的私有屬性。
Public表示該屬性(方法)公開;
Private表示該屬性(方法)為隻有本類內部可以訪問(類內部可見)。
(想用private還要用set和get方法供其他方法調用,這樣可以保證對屬性的訪問方式統一,並且便於維護訪問權限以及屬性數據合法性)
如果沒有特殊情況,屬性一定私有,方法該公開的公開。
如果不指明誰調用方法,則默認為this。
區分實例變量和局部變量時一定要寫this。
最後更新:2017-04-02 16:47:46