標籤:bubuko 電腦 預設 www 基本 lse 技術 eset 類的繼承
2018-04-29
類和對象
一、什麼是抽象
在電腦科學中,抽象是一種過程,在這個過程中,資料和程式定義的形式與代表的內涵語言相似,同時隱藏了實現細節。
抽象:一個概念或者想法不和任何特定的具體執行個體綁死。
簡單地說:“抽象只從正確的角度,透露對象的某些相關細節。”
在物件導向編程理論中,抽象涉及到定義抽象對象的語言基礎,它到底如何工作、如何擷取和改變狀態,並與系統中的其他對象進行“交流”。
抽象在任何程式設計語言中的許多方面起作用。從建立子程式到定義介面來,產生低級語言調用,例如設計模式
參考部落格
二、對象和類的關係
1.對象
狀態(屬性)
行為(功能)
---------------------------------------------------------------------------------------------------------------------------
在現實中任何存在的事物都可以看成對象 通過其屬性進行分類
比如生物包括動物等不同種類,動物又分貓科等 貓科又分特定物種
而每一個對象都是一個單獨的個體,就好像世界上不存在兩個你
在程式中也是如此,類的繼承就好像生物包括動物、動物包括貓科這樣
而對象也是通過不同的類來建立出來的單獨的個體
類之間只存在繼承關係(extends ) 就和上邊說的 生物包括動物 動物包括貓科
而介面相當於擁有能力 一個生物可以擁有很多能力 但是他只屬於一個類別
所以說只有介面才可以implements
對此 你也可以理解為extends過來的是父母教的 implements 是自學成才。
------------------------------------------------------------------------------------------------------------------------------
通過對多個同類型的對象分析,我們可以把對象抽象成類。
2.類
具有相同屬性(狀態)和行為(功能)的對象的抽象就是類。 類實際上是一種資料類型。
因此,對象的抽象是類,類的具體化是對象(類的執行個體化就是對象)。
類具有的屬性也就是對象的狀態,使用成員變數定義,用來封裝資料。
類具有的功能也就是對象的行為,定義在方法裡面。
類是對象的模板/類型。建立一個對象,就是使用類作為構建該對象的基礎。描述類少不了對象,描述對象也少不了類。“先有雞還是先有蛋”。
在物件導向編程裡,先有類才有對象,如果沒有類對象無法執行個體化。
對象是類的執行個體,類是對象的模板。(根據模板來建立執行個體)
三、類的定義
[修飾符] class 類名{
//定義成員變數(欄位/field)
//定義成員方法
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
定義類的注意事項:
1)如果類使用了public修飾符,則當前檔案名稱必須與類名相同。
2)類名最好使用名詞表示,因為類表示一類事物。類名首字母大寫,如果是多個單片語成則使用駝峰標記法命名,如:EmployeeSetting
3)在物件導向學習過程中,專門為描述對象提供一個類,該類不需要main方法,我們再專門定義一個測試類別用來運行程式。
四、對象基本操作
a)對象的建立和使用
1.(根據類)建立對象的文法:
類名 變數 = new 類名();
2.給欄位設定值
物件變數.欄位名 = 該類型的值;
3.擷取欄位值
該欄位類型 變數 = 物件變數.欄位值;
4.通過對象調用方法
物件變數.方法名([實參]);
b)對象的執行個體化過程
先為對象分配空間,並按屬性類型預設初始化
ps:八種基礎資料型別 (Elementary Data Type),按照預設初始化,其他資料類型預設為null
不同類型的成員變數的初始值:
對象執行個體化記憶體分析:
c)對象的生命週期
對象的列印操作:object的toString方法
對象的比較操作:“==”對於基礎資料型別 (Elementary Data Type)比較的是值,對於參考型別比較的是記憶體中的地址值
如果對象擁有完全相同的資料,想讓他們相等,使用object的equals方法
對象的生命週期:
開始:使用new建立對象的時候,記憶體中就會分配一個空間
結束:當堆中的對象沒有被任何變數引用,此時改對象就成了垃圾,等著被記憶體回收行程(GC)回收垃圾,當改垃圾被回收的時候,對象就被銷毀了。(回收垃圾的目的是為了釋放更多的記憶體空間)
d)匿名對象
沒有名稱的對象,建立對象之後沒有賦給一個變數。
new Servant();//匿名對象只是在堆中開闢一塊新的記憶體空間,但是沒有把該空間的記憶體位址賦給任何變數
因為沒有名稱,所以匿名對象只能使用一次。
------------------------------------------------------------------------------------------------------------
普通申明一個對象是這樣的
A a = new A();
那麼這個時候a就是類A的一個對象,這個對象名字就是a
再來看下面一個例子:
method(A a);
整理method是一個方法,他需要傳遞一個對象來作為參數,那麼這個時候有2種方法:
方法1:
A a =new A();
method (a);
方法2:
method (new A());
方法2中new A()就是一個匿名對象,他沒有名字。這樣可以理解了吧。
--------------------------------------------------------------------------------------
匿名對象的用法:
1)當對象的方法只調用一次時,可以用匿名對象來完成,這樣寫比較簡化。
如果對一個對象進行多個成員的調用,就必須給這個對象起個名字。
2)匿名對象使用方法二:可以將匿名對象作為實際參數進行傳遞。
e)學生繳費案例
學生類(Student)有兩個欄位:name(名字)和isFee(是否交學費的狀態),有一個方法交學費(fees)。
每一個學生都是通過Student類new出來的一個對象,現在建立一個數組存放多個學生對象,再判斷數組中的學生是否已經交費,如果沒有則調用交學費的方法。
代碼實現:
1 class Student 2 { 3 String name;//名字 4 boolean isFee = false;//是否交費,預設未交費 5 6 //定義交學費的方法 7 void fees(){ 8 isFee = true; 9 }10 }11 12 13 //測試類別14 public class TestDemo15 {16 public static void main(String[] args){17 18 Student s1 = new Student();19 s1.name = "李白";20 s1.isFee = true;21 22 Student s2 = new Student();23 s2.name = "魯班";24 25 26 Student s3 = new Student();27 s3.name = "張三";28 s3.isFee = false;29 30 Student s4 = new Student();31 s4.name = "李軍";32 s4.isFee = true;33 34 //建立數組用來存放多個學生對象35 Student[] arr = new Student[] {s1,s2,s3,s4};36 //使用for-each迴圈迭代數組元素37 for(Student ele : arr){38 //System.out.println(ele.name + "," +ele.isFee);39 40 //判斷是否交費,如果沒有交費則調用fees方法41 if(!ele.isFee){42 ele.fees();43 }44 }45 for(Student ele : arr){46 System.out.println(ele.name + "," +ele.isFee);47 }48 49 }50 }
輸出結果:
記憶體分析:
二、Java物件導向(3)_類和對象