一、面向對象的基本概念
編程兩種思維方式:
(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";