面向對象的基本理解


一、面向對象的三大基本特征以及五大原則

三大基本特征:

1、 封裝: 

將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問;只能通過規定的方法訪問數據;隱藏類的實例細節,方便修改和實現;(對封裝的屬性不一定要通過get/set方法,其他方法也可以對封裝的屬性進行操作。當然最好使用get/set方法,比較標准。) 

訪問修飾符

本類

同包

子類

其他

private

 

 

 

dafule

 

 

protected

 

public

 

 

2、 繼承:

繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為,子類擁有父類的所有屬性和方法(除了private修飾的屬性不能擁有)從而實現了實現代碼的復用; (java中的繼承是單繼承,即一個類只有一個父類);

只要在子類加上extends關鍵字繼承相應的父類:

Class 子類 extends 父類{

  方法體

}

子類不能繼承父類的private成員以及父類的構造方法

Object類是所有類的父類,如果一個類沒有使用extends關鍵字明確標識繼承另一個類,那么這個類默認繼承Object類。(Object類中的方法,適合所有子類!!!)

優點:提高了代碼的復用性以及維護性

 缺點:耦合增加

3、 多態:

多態同一個行為具有多個不同表現形式或形態的能力。是指一個類實例(對象)的相同方法在不同情形有不同表現形式。多態機制使具有不同內部結構的對象可以共享相同的外部接口。這意味着,雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。

多態存在的三個必要條件

  • 繼承
  • 重寫(子類繼承父類后對父類方法進行重新定義)
  • 父類引用指向子類對象

 

 多態的優點:

  • 1. 消除類型之間的耦合關系
  • 2. 可替換性
  • 3. 可擴充性
  • 4. 接口性
  • 5. 靈活性
  • 6. 簡化性

 

 

 

 

五大基本原則:

 1、單一職責原則(SRP)

一個類應該有且只有一個去改變它的理由,這意味着一個類應該只有一項工作。

  2、開放封閉原則(OCP)

  對象或實體應該對擴展開放,對修改封閉。

3、里氏替換原則(LSP)

比如,假設有兩個類,一個是Base類,另一個是Child類,並且Child類是Base的子類。那么一個方法如果可以接受一個基類對象b的話:method1(Base b)那么它必然可以接受一個子類的對象method1(Child c).

里氏替換原則是繼承復用的基石。只有當衍生類可以替換掉基類,軟件單位的功能不會受到影響時,基類才能真正的被復用,而衍生類也才能夠在基類的基礎上增加新的行為。

 

但是需要注意的是,反過來的代換是不能成立的,如果一個軟件實體使用的是一個子類的話,那么它不一定適用於基類。如果一個方法method2接受子類對象為參數的話method2(Child c),那么一般而言不可以有method2(b).

4、依賴倒置原則(DIP)

  高層次的模塊不應該依賴於低層次的模塊,他們都應該依賴於抽象。具體實現應該依賴於抽象,而不是抽象依賴於實現。

抽象不應該依賴於細節,細節應當依賴於抽象。換言之,要針對抽象(接口)編程,而不是針對實現細節編程。

 5、接口隔離原則(ISP)

  不應強迫客戶端實現一個它用不上的接口,或是說客戶端不應該被迫依賴它們不使用的方法,使用多個專門的接口比使用單個接口要好的多!

比如,為了減少接口的定義,將許多類似的方法都放在一個接口中,最后會發現,維護和實現接口的時候花了太多精力,而接口所定義的操作相當於對客戶端的一種承諾,這種承諾當然是越少越好,越精練越好,過多的承諾帶來的就是你的大量精力和時間去維護!

大部分內容來自:

https://www.cnblogs.com/fzz9/p/8973315.html#%E3%80%80%E3%80%802%E5%BC%80%E6%94%BE%E5%B0%81%E9%97%AD%E5%8E%9F%E5%88%99ocp

OOA:面向對象分析

OOP:面向對象編程

OOD:面向對象設計

AOP:面向切面編程

二、局部變量和全局變量的區別

成員變量和局部變量的區別?
A:在類中的位置不同
成員變量:在類中方法外
局部變量:在方法定義中或者方法聲明上
B:在內存中的位置不同
成員變量:在堆內存
局部變量:在棧內存
C:生命周期不同
成員變量:隨着對象的創建而存在,隨着對象的消失而消失
局部變量:隨着方法的調用而存在,隨着方法的調用完畢而消失
D:初始化值不同
成員變量:有默認初始化值
局部變量:沒有默認初始化值,必須定義,賦值,然后才能使用。

注意事項:

局部變量名稱可以和成員變量名稱一樣,在方法中使用的時候,采用的是就近原則。

 

以上內容來自:https://blog.csdn.net/u012979602/article/details/78334246

 

三、OO中先有對象還是先有有類?

OOP中:類的定義:類(Class)實際上是對某種類型的對象定義變量和方法的原型。是具有相同屬性和操作的一組對象的集合!它表示對現實生活中一類具有共同特征的事物的抽象,是面向對象編程的基礎。看到這里,已經無需多言,標准答案,是先有對象,再有類

大佬有詳細說明:

https://www.cnblogs.com/kubixuesheng/p/4132116.html

 

 

 

 

1、 在實例化對象時(new 對象),構造方法會進入方法區並開辟空間;而通過this或者super來調用構造方法時,相當於調用的方法進入方法區,並沒有開辟空間;值得一提的是,這里在《JAVA編程思想》中有點小出錯,它把構造方法歸為靜態方法,構造方法具有靜態方法的一些特點,但並不屬於靜態方法;

2、 今天問了老師一個問題,這個問題我本應該先去思考,查看源碼,雖然是個小問題,但也體現了我的基礎上很多不足,以及思考方式的錯誤,況且以前還是學過以及看過源碼,都給忘了;

 

 

 

在這個Teacher類中,我重寫了toString方法,以前一直沒有當回事,直接實例化對象后,把引用變量輸出了,並未調用這個重寫了的toString方法,

 

那么為什么沒有調用這個重寫了的toString還是會輸出toString的內容了?從源碼上看來:

 

 

是不是有點懂了?那就把它看懂並且去理解這種方式,試着去舉一反三:

我們在上圖的valueOf的源碼看來:

 

 

原來這個valueOf已調用了toString方法,而回到開頭我們講的

 

 

圖片上的第二行相當於第三行,直接輸出teacher引用變量調用的並不是Teacher類里我們重寫的toString方法,而是println里的toString.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM