轉載:https://www.cnblogs.com/hbai/p/5106635.html
面向對象主要針對面向過程。
面向過程的基本單元是函數。
什麼是對象:EVERYTHING IS OBJECT(萬物皆對象)
所有的事物都有兩個方面:
有什麼(屬性):用來描述對象。
能夠做什麼(方法):告訴外界對象有那些功能。
後者以前者爲基礎。
大的對象的屬性也可以是一個對象。
爲什麼要使用面向對象:
首先,面向對象符合人類看待事物的一般規律。
對象的方法的實現細節是屏蔽的,只有對象方法的實現者瞭解細節。
方法的定義非常重要。方法有參數,也可能有返回值。
注意區分:對象(本身)、對象的實現者、對象的調用者。
分析對象主要從方法開始。
我們通過類來看待對象,類是對象的抽象。
其次,採用面向對象方法可以使系統各部分各司其職、各盡所能。
對象之間的耦合性一定要低(比如不同硬盤和不同主板之間的關係)。這樣才能使每個對象本身做成最好的。
對於對象的要求:高內聚、低耦合,這樣容易拼裝成爲一個系統。
實現高內聚就是要最大限度低提高複用性(複用性好是因爲高內聚)。
可複用性是OOP的基礎。
比較面向過程的思想和麪向對象的思想:
面向過程的思想:由過程、步驟、函數組成,以過程爲核心;
面向對象的思想:以對象爲中心,先開發類,得到對象,通過對象之間相互通信實現功能。
面向過程是先有算法,後有數據結構。
面向對象是先有數據結構,然後再有算法。
在用面向對象思想開發的過程中,可以複用對象就進行復用,如無法進行復用則開發新的對象。
開發過程是用多個簡單的對象的多個簡單的方法,來實現複雜的功能 。
從語法上來看,一個類是一個新的數據類型。
在面向對象編程中,除了簡單數據類型,就是對象類型。
定義類的格式:
class Student{
代碼
}
注意類名中單詞的首字母大寫。
實例變量:定義在類中但在任何方法之外。(New出來的均有初值)
局部變量:定義在方法之中的變量。
局部變量要先賦值,再進行運算,而實例變量均已經賦初值。這是局部變量和實例變量的一大區別。
實例變量的對象賦值爲null。
局部變量不允許範圍內定義兩個同名變量。實例變量的作用域在本類中完全有效,當被其他的類調用的時候也可能有效。
實例變量和局部變量允許命名衝突。
書寫方法的格式:
修飾符 返回值 方法名 調用過程中 方法體
可能出現的例外
public int/void addNumber(參數) throw Excepion {}
例:
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的引用。
注意:在對象變量中存放的是引用(地址);在簡單變量中存放的是數值。
可以構造多個構造方法,但多個構造方法的參數表一定不同,參數順序不同即屬於不同的構造方法:
public student(string name,int a){
}
public student(int a,string name){
}
爲兩個不同的構造方法。
如果我們未給系統提供一個構造方法,那麼系統會自動提供一個爲空的構造方法。
練習:寫一個類,定義一個對象,定義兩個構造方法:一個有參,一個無參。
(編寫一個程序驗證對象的傳遞的值爲地址)
注意下面這種形式:
static void changename(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(string n){
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。
這讓自己變得更加強。