【云駐共創】Java面向對象編程初識與初知
1. Java面向對象
1.1 面向過程
面向過程編程是分析出解決問題的步驟,然后使用函數把這些步驟一步步實現,重心放在完成的每個步驟上。
是按照一定順序進行執行,其程序結構也是按照功能劃分為若干個基本模塊(步驟),在每個功能上都是相對獨立的,而每個模塊實現的具體方法則是使用子程序來進行實現的,如下圖示例:
廚師炒菜==》檢查食材(檢查有沒有十八個頭的鮑魚、檢查有沒有極品刺身。。。)==》沒有就再去市場買(買鮑魚、買澳龍。。。)==》洗菜(洗青菜、洗蘿卜。。。)==》開火(打開燃氣閥、扭動點火按鈕。。。)==》炒菜(大火爆炒、小火煸炒。。。)==》出鍋裝盤(小炒裝小盤、燉菜裝盆。。。);
1.2 面向對象
構成問題事物分解成各個對象,描述某個事物在整個解決問題的步驟中的行為。
是把數據以及對數據的操作放在一起,作為一個相互依存的整體,程序流程實現由使用者在使用的過程中進行具體定義,如下圖示例:
廚師炒菜==》將這件事分為三個方面去做(廚師、采購員、廚具)
廚師包含檢查食材和炒菜的責任;
采購員包含選菜和買菜的責任;
使用廚具來完成洗菜、切菜和備菜的任務;
這樣各司其責,互相通過信息來進行溝通交互,每個方面可以在完成的時候自行定義各自的具體實現;
1.3 面向過程和面向對象的區別
面向過程是步驟,是按部就班的解決問題;面向對象關注的是解決問題所關注的對象;面向過程是自己辦事,面向對象是托人辦事。
1.4 類和對象
1.4.1 類的定義
類是對象抽象產生出來的模板,如果對同一類對象抽象出其中的共性就形成了類,用于描述一類對象的行為和狀態。
1.4.2 對象的定義
對象是具體的,是通過這一系列抽象出來的類模板,進行自定義的填充而形成的實例。
例1:人具有身高,體重,年齡,血型,性別等一些特征,人會勞動,會行走,會吃飯等這些方法,人僅僅是一個抽象的概念,它是不存在的實體,但是所有具備人這個群體的屬性與方法的對象都叫做人,其中人就是抽象出來的類模板,而具體的某人(張三、李四、小助手。。。)就是實際存在的實體即為對象,因此我們可以總結出來每個人(具體的人,張三、李四、小助手。。。)都是人這個群體(類)的一個對象。
1.4.3 Java的類和對象的創建
對象的創建過程,必須先有類,然后通過類創建對象,格式是:類名 對象 = new 類名();,例如:Person person = new Person();。
如下圖是先創建了一個Person類,再在main函數中(主函數)進行new操作,即創建對象(對象都有了,那還不想干啥干啥嘛~),給她起了名字、給她設置個身高、設置個年齡,這些都是對象的屬性而設定具體值的過程是給對象的屬性進行賦值。
1.4.4 new關鍵字
從上面的例子我們可以知道new關鍵字,可以通過類來創建對象,表示具體的實例化對象以及申請內存空間,下圖為創建對象的過程與內存空間之間的表現:
首先是person在棧內存中被聲明,然后通過new關鍵字,在堆內存申請開辟內存空間,并且實例化賦初始值(age=0,name=null),最后給對象的屬性賦值(person.name=“小張”;person.age = 20;)
如果我們創建了多個對象,在內存中是如何表現的呢?只要通過new關鍵字創建對象了,就會在堆內存開辟一個新的內存空間,因此他們之間的值是相互隔離的,互相不影響的,如下圖所示:
1.5 實例變量和靜態變量
1.5.1 實例變量
(1) 聲明在一個類中,但在方法、構造方法和語句塊之外。
(2) 無static關鍵詞修飾;
(3) 數值類型的默認值為0;
(4) 布爾類型的默認值false;
(5) 引用類型的默認值為null;
(6) 實例變量屬于該類的對象,必須產生該類對象,才能進行調用;
其中age、name、flag就是實例變量。
1.5.2 靜態變量
獨立于方法之外的變量,用static關鍵字修飾,也叫類變量。
注:方法中的變量叫做局部變量不能用static修飾;
1.5.3 靜態變量和靜態變量何時設置
屬于所有對象所共享的公共屬性的就設置為靜態變量,屬于具體對象的個性化的屬性就設置為實例變量。
1.6 匿名構造塊和構造函數
1.6.1 構造函數
Java構造函數也叫構造方法是Java中特殊的函數,沒有返回值并且函數名和類名保持一致。new對象產生后,就調用了對象的屬性和方法,一般來初始化成員屬性和成員方法。
1.6.1.1構造函數的格式
(1)修飾符 類名(參數列表){}
(2)類名 (參數列表){}
其中參數列表可有可無,無參數列表的構造函數為默認構造函數,無論有參還是無參的構造函數都不能有返回值,但是可以有return;關鍵字(后面不能跟具體的值);
1.6.1.2構造函數注意事項
(1)構造函數不能手動調用,是對象被創建的時候JVM調用的;
(2)如果一個類沒有構造函數,JVM在編譯的時候回默認的添加一個無參的構造函數;
(3)如果定義了構造函數,JVM不會再創建無參構造方法;
(4)創建對象的時候,所需要的參數需要與構造函數中的參數一一對應,構造函數里有幾個參數就要提供幾個參數;
(5)構造函數可以調用構造函數;(金糊涂銀糊涂我家有個老老糊涂。。。O(∩_∩)O哈哈~)
1.6.2 匿名構造塊
構造代碼塊的格式:{具體代碼}
代碼塊的作用是用于對象統一初始化;
對象創造(調用構造函數)之前都會執行這個代碼塊;
1.6.3 構造函數重載
構造函數重載是多態的一個典型的特例,其中類中有多個構造函數并且參數列表不同,重載的構造函數用來表達對象的多種初始化行為,格式如下圖:
1.7 方法的定義和調用
1.7.1 方法的定義
方法是類或對象的行為特征的抽象;
Java中方法不能單獨存在,必須存在在類中(有了人,才能有人吃飯、睡覺、發博客這些動作);
語法格式:
權限修飾符 返回值類型 方法名 (參數列表){
//方法體
//返回值
}
1.7.2 方法定義的注意事項
(1)方法定義的先后順序是不影響調用的;
(2)方法定義不能產生嵌套包含關系,即在方法的內部不能再定義別的方法;
(3)方法定義中的返回值與傳遞的參數類型均為Java中定義的數據類型;
(4)在方法中可以進行返回數據的處理,格式:
return:返回數據類型(必須和方法聲明的類型保持一致);
void:不返回數據類型;
1.7.3 方法調用
(1)方法定義后,不會自動執行,如果需要執行,必須進行調用(大魚大肉就在那里,不做不叫外賣,咋能進肚子嘛~);
(2)本類的方法調用格式是:方法名(參數列表);
(3)外部類的方法調用格式是:調用類的對象.方法名(參數列表);
1.7.4 構造函數和普通方法(函數)的區別
構造函數是初始化對象的,普通函數是描述事物的公共行為的。
1.8 方法的重載和編譯時多態
1.8.1 方法的重載
一個類中如果有多個方法名稱相同(與修飾符無關),并且參數列表不同,返回值類型不同,這類形式稱為方法的重載,即同一個方法不同的使用形式得到不同的實現結果(一蝦多吃的既視感),如下圖示例:
1.8.2 編譯時多態
方法重載也叫編譯時多態。
為什么這樣叫呢?因為方法重載是早期綁定完成的,如果去調用一個重載的方法,那么在編譯時就會根據參數列表來確定具體使用的方法。
而早期綁定就是指被調用的目標方法如果在編譯期(編譯成.class文件)可以確定,且運行期(運行編譯后的.class文件)保持不變時,即可將這個方法與所屬的類型進行綁定,即早期綁定。
1.9 面向對象的封裝
1.9.1 封裝
封裝是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。
1.9.1.1封裝的原則
將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共方法對其訪問。
1.9.1.2封裝的好處
提高數據訪問的安全性,隱藏了實現細節;
從數據安全角度考慮沒有封裝,在外部類中就可以直接訪問,并且修改數據,造成數據的不安全性;
1.9.1.3封裝的實現
可以對需要隱藏的屬性增加private修飾詞(變成私有的),外部不能直接修改,然后提供公共的修改方法(當然在里面會設置自定義的條件),外部類通過這個公共方法,在滿足條件的情況下才會修改私有的屬性,如下圖示例:
1.9.1.4封裝的機制
即該露的露,該藏的藏。
程序設定追求的是“高內聚,低耦合”(各干各的,如果你想參合,我給你提供工具啊~);
高內聚就是類的內部數據操作細節自己完成,不允許外部干涉(能夠完美形成一個整體);
低耦合就是僅暴露方法給外部使用(互不干擾);
注:應禁止直接訪問一個對象中數據的實際表示,而是通過操作方法來訪問(數據的隱藏)。
1.10 this關鍵字
this關鍵字代表當前對象的一個引用,而所謂當前對象,指的是調用類中的方法或屬性的對象。
1.10.1 this訪問本類屬性
this只能在方法內使用,表示對“調用方法的對象”的引用;
this.屬性名,表示本對象自己的屬性。
下面示例,即表示為p1.name = “小張”;p1.age=20;p2.name = “小李”;p2.age=22;可以看出this指代的是調用各自有參構造方法的對象的引用。
1.10.2 this調用方法
this(參數列表)表示調用本類的構造函數,參數列表為空時表示調用無參構造函數,并且this關鍵字必須位于構造函數的第一行;
this.方法名(參數列表)表示調用當前對象自己的方法。
1.10.3 this使用注意事項
this不能用于靜態方法和靜態快,由于main方法也是靜態的,所以this也不能用于main方法,只能在實例方法中使用。
1.11 static關鍵字
1.11.1 靜態變量
由static關鍵詞修飾的變量也稱為靜態變量或者類變量(從名字可以看出靜態變量是屬于類的),被所有的對象所共享,在內存中只有一個副本,當且僅當類初次加載時會被初始化(意味著最先被初始化),通過類名就可以直接調用(建議使用),也可以通過對象名.靜態變量名進行調用。
1.11.2 靜態方法
由static關鍵詞修飾的方法叫做靜態方法也叫做類方法。需要注意如下幾點:
(1)在靜態方法中不能直接訪問類的非靜態成員變量和非靜態成員方法,即不能直接去訪問實例方法和實例變量,只能通過創建類的對象來進行訪問;
(2)靜態方法中不能使用this關鍵字;
(3)通過類名可以直接調用靜態方法(建議使用),也可以通過對象名.靜態方法名進行調用。
1.11.3 靜態塊
靜態代碼塊在類加載時執行并且只執行一次,在類中可以有多個靜態代碼塊(按照順序執行),并且靜態代碼塊中不能有this關鍵字。
1.11.4 靜態塊、匿名構造塊、構造函數的執行順序
他們的執行順序為:靜態代碼塊最先執行并且無論創建多少次該類對象都只調用一次,接著調用匿名構造塊,最后調用構造方法,并且每次創建對象的時候都會調用一次匿名構造塊和構造方法。
1.12 類的生命周期和設計
1.12.1 java的一個類的生命周期
(1)加載:是將源文件編譯成.class文件,JVM將.class文件中的二進制數據讀入內存,放于方法區,并且在堆中創建class對象;(2)驗證:驗證字節碼格式是否正確、變量和方法是否有重復、繼承和實現是否符合標準;
(3)準備:為類的靜態變量分配內存并設置初始值;
(4)解析:接口名、字段名、方法名解析成內存地址方便調用;
(5)初始化:執行靜態變量初始化和靜態代碼塊并初始化自定義的變量值;
(6)使用:分為直接引用(會觸發類的初始化,比如new一個實例對象、訪問和設置靜態變量、訪問類的靜態方法、反射、啟動類的入口main方法)和間接引用(引用常量、定義數組);
(7)卸載:java中不存在該類的任何實例,已經被GC回收,無法在任何地方通過反射來訪問任何方法;
1.12.2 類的設計和分析
下面是幾個類設計的實踐案例:
學生類設計和實現:
教師類設計和實現:
課程類設計和實現:
成績類設計和實現:
1.13 java的方法參數和值傳遞
1.13.1 java的方法的參數類型
方法參數的類型分為基本類型和引用類型。
基本數據類型,傳過來的是這個參數的一個副本,對原來的值是沒有影響的;
引用類型傳過來的是這個引用參數的副本,這個副本存放的是參數的地址。
下圖中為可變參數列表,其中int...a為可以傳0個參數,也可以傳多個參數。
注:可變參數列表只能有一個,如果有多個參數時只能放在末尾。
1.13.2 Java參數傳遞基本數據類型和引用數據類型的區別
Java 面向對象編程
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。