1、基本概念
(1)過程與對象都是一種解決問題的思想。
面向過程:強調的是功能行爲,一種過程,先幹啥,再幹啥;
面向對象:將功能封裝到對象裏,強調的是具備某功能的對象;
(2)面向對象的三個特徵:封裝(Encapsulation)、繼承(Inheritance)、多態(Polymorphism)。
2、類與對象
(1)關係:類是對象的抽象,而對象是類的具體實例
類:表示一個客觀世界某類羣體的一些基本特徵的抽象
對象:是表示一個個具體的東西
(2)類的定義
[修飾符] class 類名
{
1~n個構造方法;
0~n個字段(field);
0~n個方法;
}
1)修飾符:可省略,或是public、final、abstract中的一個
2)構造方法:用來構造類的實例(默認有一個無參的構造方法,得使用new調用)
格式:[修飾符] 構造方法名(形參列表){ 。。。}
修飾符:可省略,或是public、protected、private中的一個
構造方法名:必須與類名相同
【注】:A、其聲明處不能有任何返回值類型的聲明
B、不能使用return返回一個值;(return;可以)
3)field(成員變量|字段|域):類或對象所包含的數據,對類狀態的一種描述
格式:[修飾符] field類型 field名[=默認值];
修飾符:可省略,或是public、protected、private中的一個,static,final
4)方法:類或對象的特徵和行爲
格式:[修飾符] 方法返回值類型 方法名(形參列表){。。。}
修飾符:可省略,或是public、protected、private中的一個,static,final|abstract
(3)對象的定義、創建和使用
A、格式:類名 對象名稱 = new 類名(); //其實是兩步操作
類名 對象名稱 ; //聲明對象
對象名稱 = new 類名(); //實例化對象
B、對象名保存在棧內存(訪問地址)中,對象的具體內容保存在堆內存中
C、“對象名.對象成員”的方式來操作對象中的內容
訪問屬性:對象名.屬性名;
訪問方法:對象名.方法名
(3)匿名對象
定義:不定義變量引用對象,使用new關鍵字創建對象後直接使用,這樣的對象沒有名字,所以叫匿名對象。
特點::A、匿名對象只進行一次調用,而且它只在堆內存中開闢空間,而沒有在棧內存的引用。當對象對成員進行多次調用時,不能使用匿名對象,必須給對象起名字。B、可作爲實際參數進行傳遞。new Car().show(new Car());
(4)成員變量和局部變量的區別:
1:成員變量直接定義在類中,整個類中都可以訪問;局部變量定義在方法中,參數上,語句中,只在所屬的區域上有效。
2:成員變量存在於堆內存中,隨着對象的產生而存在,消失而消失。局部變量存在於棧內存中,隨着所屬區域的運行而存在,結束而釋放。
3、成員變量都有默認初始值,而局部變量則沒有
補充:成員變量初始化
當一個對象被創建時,會對其中各種類型的成員變量自動進行初始化賦值。基本數據類型初始化值爲0,引用數據類型初始化值爲null。
(5)構造函數 (構造器 == 構造方法)
1)特點:A、方法名與類名相同 B、不用定義返回值類型 C、不需要寫return語句
2)作用:給類中的字段進行初始化,可以用來創建對象
3)記住:所有對象創建時,都需要初始化纔可以使用。(new都會調用構造函數)
注意事項:一個類在定義時,如果沒有定義過構造函數,那麼該類中會自動生成一個空參數的構造函數,爲了方便該類創建對象,完成初始化。如果在類中自定義了構造函數,那麼默認的構造函數就沒有了。
一個類中,可以有多個構造函數,因爲它們的函數名稱都相同,所以只能通過參數列表來區分。所以,一個類中如果出現多個構造函數。它們的存在是以重載體現的。
4)構造函數和一般函數有什麼區別呢?
1:兩個函數定義格式不同。
2:構造函數是在對象創建時,就被調用,用於初始化,而且初始化動作只執行一次。一般函數,是對象創建後,需要調用才執行,可以被調用多次。
5)什麼時候使用構造函數呢?
分析事物時,發現具體事物一出現,就具備了一些特徵,那就將這些特徵定義到構造函數內。
6)構造代碼塊和構造函數有什麼區別?
構造代碼塊:是給所有的對象進行初始化,也就是說,所有的對象都會調用一個代碼塊。只要對象一建立。就會調用這個代碼塊。構造函數:是給與之對應的對象進行初始化。它具有針對性。
7)Person p = new Person();
創建一個對象都在內存中做了什麼事情?
1:先將硬盤上指定位置的Person.class文件加載進內存。
2:執行main方法時,在棧內存中開闢了main方法的空間(壓棧-進棧),然後在main方法的棧區分配了一個變量p。
3:在堆內存中開闢一個實體空間,分配了一個內存首地址值。new
4:在該實體空間中進行屬性的空間分配,並進行了默認初始化。
5:對空間中的屬性進行顯示初始化。
6:進行實體的構造代碼塊初始化。
7:調用該實體對應的構造函數,進行構造函數初始化。()
8:將首地址賦值給p ,p變量就引用了該實體。(指向了該對象)
8)setter方法和構造方法都可以用來初始化字段的值,那麼什麼時候用構造方法什麼時候用setter?
A、當字段的值是和類的對象緊密相關不可分割的時候,用構造方法,就是說我要有這個實例,就必須有這個字段值,就用構造方法。
B、需要初始化的字段值不太多的時候可以用構造方法,如果字段值太多,構造方法的參數列表太。。。了。
C、其他時候都可以用setter方法。