面向對象的基本概念

一、面向對象的基本概念

編程兩種思維方式:

(1)面向過程的編程方式
根本具體的操作步驟去實現程序
缺點:不通用,只指對一個程序(事情)
            不利於維護(不能適應變化)


(2)面向對象的編程方式
解決程序適應變化的能力(可維護性強)降低功能之間的相互依賴
(1)先整體,後局部
(2)先抽象,再具體
(3)能做什麼,怎麼做


考慮粒度的問題


如何抽象:
考慮事物的共同點(共性)
JAVA 裏是:一切皆對象


二、類與對象

對象:一切具體的事物
類:同有相同特徵(屬性)和行爲(方法)的事物集合
分類,類別
程序的組織結構就是類


(1)new關鍵字:表示向內存申請空間,也表示實例化一個對象,
    創建一個對象。
(2)一個對象在內存中的大小,由該對象的所有屬性所佔的內存
    大小的總和。引用類型變量在32位系統上佔4個字節,在64位
    系統上佔8個字節。加上而外的對象隱性數據所佔的大小。
(2)相同的類型纔可以賦值
(3)不同的引用,指向同一個對象,任何一個引用改變對象的值,
    其它引用都會反映出來。


(4)編程時要注意的問題,在確定不使用對象時,要儘早釋放對象
    :引用=null
(5)當一個堆中的對象沒有被任何引用變量所指向時,該對象會被
    JVM 的 GC 程序認爲是垃圾對象,從而被回收。


三、封裝性

面向對象的特徵是什麼:
封裝、繼承、多態、抽象
面向對象的三大特徵:封裝、繼承、多態


封裝性:
封裝的概念:隱藏實現細節,提供對外訪問的接口


好處:
隱藏細節
安全性
模塊化
代碼重用
插件化易於調試
利於維護


封裝:
屬性的封裝,方法的封裝,類的封裝,組件的封裝,模塊化封裝
系統級封裝


封裝缺點:
會影響執行效率


四、構造方法

是在創建對象時自動調用。
構造 方法的特點:
(1)構造方法名稱與類名相同,沒有返回值聲明(包括 void)
(2)構造方法用於初始化數據(屬性)
(3)每一個類中都會有一個默認的無參的構造方法
(4)如果類中有顯示的構造方法,那麼默認構造方法將無效
(5)如果有顯示的構造方法,還想保留默認構造 方法,需要
        顯示的寫出來。
(6)構造方法可以有多個,但參數不一樣,稱爲構造方法的重載
(7)在構造方法中調用另一個構造方法,使用this(...),該句代碼
        必須在第一句。
(8)構造方法之間的調用,必須要有出口。
(9)給對象初始化數據可以使用構造方法或setter方法,通常情況
        下,兩者都會保留。
(10)一個好的編程習慣是要保留默認的構造方法。
        (爲了方便一些框架代碼使用反射來創建對象)
(11)private Dog(){},構造方法私有化,當我們的需求是爲了
        保正該類只有一個對象時。
        什麼時候一個類只需要一個對象?比如,工具類
        (沒有屬性的類,只有行爲)並且該工具
        對象被頻繁使用。權衡只用一個對象與產生多個對象的內存
        使用,來確定該類是否要定義爲只需要一個對象。


//操作文件
public class FileUtils{
    private FileUtils(){}
    public void save(){
        //..
    }


    public void read(){
        //...
    }
}


FileUtils fu = new FileUtils();
fu.save();
fu.read();
//FileUtils fu = new FileUtils();


fu.save();
fu.read();
//FileUtils fu = new FileUtils();


fu.save();
fu.read();


五、方法的重載(overloading)

方法的重載是發生在同一個類中,
多個方法,方法名相同,參數列表不同,返回值不能作爲重載的條件
什麼時候用重載?
當我們的業務類型類似,參數不一樣,就可以使用重載,比如:


public void save(String path){} //把數據保存到文件中
public void save(Cat cat){}//把對象保存到數據庫中
//public boolean save(Cat cat){}


六、String類

(1)String類的兩種賦值方式:
1、String s1 = "小黃";
2、String s2 = new String("小黃");
直接賦值:檢查字符串中的常量池(堆內存)是否存在該對象,如果存在,則直接指向
                該對象,如果不存在,就在常量池中創建並指向該對象。(最少不用創建
                對象,最多隻創建一個對象)
使用new關鍵字:在堆內存中創建一個字符串對象,並指向該對象,然後檢查常量池中
        是否存在該字符串對象,如果存在,則結束;如果不存在,就在常量池中創建一個
        字符串對象,以供其它直接賦值時使用。(最少創建一個對象,最多創建兩個對象)


在 JAVA 中,我們推薦使用直接賦值的方式,有助於節省內存空間。
面試題:String s2 = new String("abc"); 創建了幾個對象?


String類真正用於存儲數據是使用char[]


在 String字符串相加時,是在常量池中創建對象還是在堆中創建新對象?
如果字符串的值在編譯期可以被確定,那麼會在常量池中創建
否則在運行期時在堆中創建對象


結論:
字符串常量相加,不會產生垃圾對象
字符串與變量相加,加的越多,垃圾對象越多
String s = "6"+ "abc" + "b" +"677" + "x";







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章