面向對象怎樣理解?

2020-05-23     segmentfault官方

原標題:面向對象怎樣理解?

本文轉載於 SegmentFault 社區

作者:程式設計師大大

面向對象(一)

1.什麼是面向對象

1.1語言的分類

  • 第一代語言:機器語言

  • 第二代語言:彙編語言

  • 第三代語言:高級語言

1.2面向對象和面向過程的區別

1:面向過程

針對小問題的時候,面向過程可以很簡單的解決問題,事情複雜的時候面向過程就顯得力不從心。面向過程是微觀上解決問題的方式。

比如:領導出遊,司機開車。

  • 領導找司機開車

  • 司機取車

  • 司機加油

  • 定製出遊路線

這些問題都是面向過程解決的問題。

2:面向對象

面向對象是解決事情的另外一種方式,針對小問題的時候有點大才小用,問題複雜的時候就顯得很輕鬆。面向對象是宏觀上解決問題的方式。

比如:領導出遊,司機開車。

  • 領導和司機就是兩個對象

  • 領導:出錢,出車,管去哪

  • 司機:開車。

3:區別和聯繫

面向對象和面向過程是相互依存的,人們思考問題是用面向對象的思維,最終去實現還是用面向過程。

在編碼的過程中,存在一個需求,我們應先從宏觀上去思考這個需求,再從微觀上去解決問題。

人開門這個需求,人和門都是對象,要實現這個需求只需要人去調用開門這個功能即可。

1.3對象

1:什麼是對象

女朋友是對象,茶杯是對象,電腦是對象(萬物皆對象)

對象對完提供了很多功能,我們無需一一詳細了解他們是怎麼實現的,我們只需要學會使用即可。

2:如何產生對象

現實生活中,找對女朋友很重要。

唯一見過的只有類和方法。唯一可以肯定的就是類一定和對象有關係。

3:類和對象的關係

類:鳥類,人類,魚類

多個事物具有相同的特徵,就將其歸為一類。一個類中存在很多事物。這些都是老祖先為了讓我們更好的認識這個世界,將很多具象事物歸為一類。

對象:是一個具象事物。比如:大象,洗衣機,電視。

類中存在許多對象,一個類相當於有相同特徵或者行為的對象的集合。

在java語言中類和對象的關係

類:class修飾的 一個類可以產生很多個對象。

對象:基於類的一個實例化的表現形式。

類的產生是依賴於對象的,類是將對象中相同特徵或者是行為抽取出來歸為一類;

對象的產生是依賴於類的,如果沒有類是無法產生該類的對象的,該類的實例。

類是對於對象的抽像(抽取像的部分),對象是類的具象化的表現形式。

2.如何編寫類和對象

2.1如何編寫類

類是為了產生對象的,對象是為了幫我們實現某一具體事務,對象對於使用者而言,能夠列出的有:

  • 外在的屬性:身高,性別,體重,年齡。。。。。。

  • 內在的個方法:吃飯,睡覺,走路。。。。。。

package com.mage.testww;

publicclassPerson{ String name= "zs"; intage= 18; chargender= '男'; publicvoideat( ) { System. out.println( "開始吃飯了"); }publicvoidsleep( ) { System. out.println( "睡覺了"); }}

2.2如何編寫對象

java中通過new關鍵詞來產生當前類的一個具體的實例、對象。

package com.mage.testww;

publicclassPersonTest{ publicstaticvoidmain( String[] args) { Person zs= newPerson; zs.eat;intage=zs.age; System. out.println(age); }}

  • 引用類型創造對象是用new關鍵字

  • 創建方式:類型名稱 變量名=new 類型名稱;

2.3new關鍵字的作用

  • 開空間(在堆內存中開空間)

  • 賦初值(給當前類中所有成員變量賦初始值)

  • 指向引用(將堆內存中的對象地址賦值給局部變量)

3.構造器

構造器就是在java代碼中用來產生對象的特殊方法。將該方法稱之為該類的一個構造器。

3.1構造器的注意事項

1.構造器的聲明

  • 構造器的方法名稱和類名相同,首字母一定要大寫

  • 該方法沒有返回值

  • 內部不需要寫返回值

2.構造器注意事項

  • 如果在一個類中,沒有寫出任何構造器,那麼一定存在一個空構造器。

  • 一個類中存在帶參構造器,那麼如果無參構造器沒寫,則不存在,如果編寫了,則還有。

  • 構造器也存在重載

3.2 this關鍵詞

this關鍵詞有兩種用法:this.和this

this.

代表是當前對象的,誰在調用誰就是當前對象

this大多數時候是可以省略的(出現了同名變量的時候,則不可以省略)。

this

  • this 用來實現構造器之間的互相調用

  • 其它不同方法中無法使用this,this只能在構造器中使用。

  • this在構造器中實現構造器的互相調用時必須要保證在構造器的第一行語句。

4.static

static稱為靜態的,共享的。

1.在static中使用非static修飾的

publicclassStaticTest{ staticintnum = 10; publicstaticvoidmain( String[] args) { System. out.println(num); }}

不建議使用

publicclassStaticTest{

intnum = 10;

publicstaticvoidmain( String[] args) {

StaticTest t = newStaticTest;

System. out.println(t.num);

}

}

創建當前類的對象,通過對象=方式訪問非靜態內容。

在非static中使用static修飾的

publicclassStaticTest{

staticintnum = 10;

publicstaticvoidmain( String[] args) {

StaticTest t = newStaticTest; t.method;

}

publicvoidmethod( ) {

System. out.println(num);

}

}

在一個類中非靜態內容訪問靜態內容直接通過變量名或者是方法名稱就可以訪問了。

publicclassTest02{

publicstaticvoidmain( String[] args) {

System. out.println(StaticTest.num);

}

}

在其他類中訪問靜態內容可以直接通過類名.方法名/變量名直接訪問。

靜態內容在其他類中訪問時可以通過類名直接 . ,也可以通過對象 . (不推薦使用)

2.static的注意事項

  • static修飾的內容是隸屬於類的,類被加載,靜態內容就被加載到內存中了。

  • 非static修飾的內容是隸屬於對象的,對象存在,非static的內容才能被調用。

  • 類信息是先於對象存在的。創建對象時類一定被加載到內存中了,但是如果類被加載到內存中,對

    象不一定存在。

5.繼承

5.1繼承

繼承就是子承父業,描述類和類之間的關係,編寫類時,我們發現類和類之間可以存在父子關係的,通過extends來繼承,子類extends父類。

packagecom.mage.Extends;

publicclassAnimal{ String name;intage; publicAnimal{ }publicvoidrun{ System.out.println( "我要跑步了"); }}

packagecom.mage.Extends;

publicclassDogextendsAnimal{ String color;publicDog{ }publicvoidshout{ System.out.println( this.color+ ","+ this.name+ ","+ this.age+ "汪汪"); }}

java中,一旦發生了繼承關係,子類就會擁有父類的方法和屬性,無需再次去聲明,達到了代碼的復用性。

java中一個類只有一次繼承機會,如果不能完全確定,最好不要輕易使用。

5.2內存分析

  • 創建子類對象時,父類的空構造器被調用。子類要創建對象一定會先創建父類對象。

  • 在內存中,要new子類時,會先在內存中給父類開闢一個存儲空間。存儲父類的內容。

  • 子類調用父類中定義的屬性時,子類對象中維護了和父類存儲空間的關係(紫色),給父類定義的屬

    性賦值時,能夠找到對應的父類對象。

5.3方法的重寫

當子類繼承父類之後,不滿足父類提供的功能,子類對於父類的一些方法可以重寫,對於父類的一些行為進行拓展。

重寫的前提:

  • 一定要發生繼承關係,子類方法和父類方法要同名。

  • 參數列表要一模一樣。

  • 返回值類型要一模一樣。

publicclassPerson{ String name;intage; publicPerson( ) { System. out.println( "我是父類構造器"); }publicintinfo( intnum ) { System. out.println( "姓名:"+ this.name+ "年齡:"+ this.age); return2; }}publicclassStudentextendsPerson{ intid; publicStudent( ) { System. out.println( "我是子類構造器"); }@ Overridepublicintinfo( intnum ) { System. out.println( "姓名:"+name+ "年齡:"+age+ "學號"+id); return2; }}publicclassTest{ publicstaticvoidmain( String[] args) { Student stu= newStudent; stu.age= 18; stu.id= 01; stu.name= "marry"; stu.info( 2); }}

如何判斷父子關係下的兩個方法是否重寫,在子方法的同名方法前面加一個@Override,不報錯就是發生了重寫。

調用子類對象的功能以及屬性的時候,先在當前本類對象中進行查找,如果找到了則執行,如果沒有找到去父類中進行查找。沿著繼承鏈會一直往上找。

5.4 object

object是根基類,是所有類的父親。java中的類如果沒有明確繼承關係,那麼他的父類都是object。

i.常見方法

  • 獲取到一個對象對應的Class對象(反射章節)

  • 計算當前對象的hash值(一個對象的唯一值) 【集合】

  • 克隆方法,創建對象的一種方式。【克隆模式】

  • 喚醒、喚醒所有、等待。線程通信。【多線程】

  • GC(垃圾回收器)在回收堆內存時,自動調用的方法。【GC】

ii.重要方法

toString:

  • 列印對象內容

  • 一般情況下將Object中的toString列印的內容可以看做是:包名.類名@地址值;

  • 對於對象而言,很多時候我們都是想通過toString方法查看該對象中存在哪些信息,而不單單值

    是簡單的看看內存地址。所以此時需要在當前類中重寫toString方法

  • 當直接列印一個對象時,默認情況下就調用的是當前對象的toString方法。如果當前對象沒有

    toString方法,直接執行的是父類的(Object)的toString。

equals:

比較對象是否相等

  • equals方法是用來比較兩個對象是否相等

  • equals 方法在使用時一定要注意調用者一定要保證不是null值,否則出現空指針異常。

  • null可以給任意的引用類型賦值,但是null都不屬於任意的引用類型。null通過instanceof判定從

    屬時一定為false。

  • 如果一個類中沒有重寫equals方法,那麼使用Object內部定義的equals方法,在Object中的

    equals方法通過 == 比較相等

  • 有時對象需要比較內部的屬性,從而判定是否兩個對象是一致的。比如對於一個User用戶對象,

    如果它的用戶名和密碼是相同的時候,那麼我們覺得這兩個帳戶信息是相同的。此時就一定要在當

    前類中重寫equals方法。否則將執行Object的equals方法。

  • instanceof 是用來比較對象是否屬於某個類型的 如果屬於則返回true 如果不屬於返回false。

  • Object是所有類的父類,當Object作為形式參數時,所有的子類都可以傳入。

  • java.lang.NullPointerException 空指針異常:對象.方法/屬性時如果對象是null值,則一定會空指

    針。

  • java.lang.ClassCastException 類型轉換異常:在進行引用類型轉換時可能由於類型不一致導致轉

    換過程中出現問題。

SegmentFault 思否社區和文章作者展開更多互動和交流。

文章來源: https://twgreatdaily.com/zh-mo/5-pUQHIBnkjnB-0zItsC.html

Flutter 知識點

2020-08-10