---------------------- android培訓、java培訓、期待與您交流!
Java面向對象
面向對象的設計思想在考慮問題時,以具體的事物(對象)爲單位,考慮它的屬性(特徵)及動作(行爲),關注整體。
一.面向對象概念
對象:對象就是某個具體的事物,比如一個蘋果、一臺計算機都是一個對象。每個對象都是唯一的。對象可以是一個實物,也可以是一個概念;比如一個蘋果、一項政策。現實生活中萬事萬物皆對象,面向對象的設計思想(OOP)主要是模擬現實生活中的一個個對象來編程的。對象具有屬性和行爲。
抽象:所謂的抽象,即抽取,也叫提煉或歸納總結等。主要用來把客觀世界中真實存在的事物用編程語言描述出來。這也是理解面向對象編程思想的第一步。通過抽象將現實生活中的對象模擬或映射到計算機中。
類:現實生活中任何實實在在的具體物體都叫對象,通過面向對象的抽取思想,根據很多實體的行爲特徵可以抽取出很多的對象,然後再通過歸納總結,將這些對象分門別類;類可以理解爲對事物的分類。類是構成Java面向對象編程的最小封裝單元。在Java中通過關鍵字class定義自定義的數據類型。Java中通過類來封裝現實生活中對象的各個信息。類可以封裝數據。
類和對象的關係:類是對象的類型,要創建對象就要先創建它的數據類型,即類。類描述了對象的屬性和行爲。類是對象的模板和圖紙。對象是類的一個實例,是一個實實在在的的個體。由對象可以抽取出類,類可以實例化成對象。
二,面向對象的特徵
1.封裝
所謂封裝是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。封裝有兩層含義,其一是隱藏內部行爲,即隱藏內部方法,調用者只能看到對外提供的公共方法。其二是隱藏內部信息,即隱藏內部數據成員。現在都建議不要對外公開任何數據成員,即使是外部需要知道的數據成員,也只能通過函數獲取。
封裝的好處:封裝可以隔離變化、提高易用性、提高安全性、提高重用性。
封裝的原則:
將不需要對外提供的內容都隱藏起來。把屬性都隱藏,提供公共方法對其訪問
2.繼承
繼承的概述:
多個類中存在相同屬性和行爲時,將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行爲,只要繼那個類即可。
多個類可以稱爲子類,單獨這個類稱爲父類或者超類。
子類可以直接訪問父類中的非私有的屬性和行爲。
通過 extends 關鍵字讓類與類之間產生繼承關係。
class SubDemo extends Demo{}
繼承的好處:
繼承的出現提高了代碼的複用性。
繼承的出現讓類與類之間產生了關係,提供了多態的前提。
繼承的特點:
Java只支持單繼承,不支持多繼承。
一個類只能有一個父類,不可以有多個父類。
class SubDemo extends Demo{} //ok
class SubDemo extends Demo1,Demo2...//error
Java支持多層繼承(繼承體系)
•class A{}
•class B extends A{}
•class C extends B{}
定義繼承需要注意:
•不要僅爲了獲取其他類中某個功能而去繼承
•類與類之間要有所屬( " is a " )關係,xx1是xx2的一種。
繼承中的相關概念:
a.覆寫:
子類中出現與父類一模一樣的方法時,會出現覆蓋操作,也稱爲重寫或者複寫。
父類中的私有方法不可以被覆蓋。
在子類覆蓋方法中,繼續使用被覆蓋的方法可以通過super.函數名獲取。
覆蓋注意事項:
• 覆蓋時,子類方法權限一定要大於等於父類方法權限
• 靜態只能覆蓋靜態。
覆蓋的應用:
• 當子類需要父類的功能,而功能主體子類有自己特有內容時,可以復 寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內容。
b.子類的實例化過程:
子類中所有的構造函數默認都會訪問父類中空參數的構造函數
因爲每一個構造函數的第一行都有一條默認的語句super();
子類會具備父類中的數據,所以要先明確父類是如何對這些數據初始化的。
當父類中沒有空參數的構造函數時,子類的構造函數必須通過this或者super語句指定要訪問的構造函數。
3.多態
程序中體現:父類或者接口的引用指向或者接收自己的子類對象。
好處和作用:多態的存在提高了程序的擴展性和後期可維護性
前提:需要存在繼承或者實現關係
要有覆蓋操作
多態的特點:
a. 成員方法:
編譯時:要查看引用變量所屬的類中是否有所調用的成員。
在運行時:要查看對象所屬的類中是否有所調用的成員。
b. 成員變量
只看引用變量所屬的類。
三,面向對象的優點
將一類客觀存在的事物抽象成一個類,其中包含了事物的特徵與行爲,然後根據類創建不同方法、屬性的對象,可以操作對象完成相應的工作,調用者只需調用它的方法,怎麼實現的根本不需要去了解,從而程序員就成爲了一個指揮者的角色,可以輕鬆的操作對象,需要哪類事物,就創建那種對象。
四,面向對象中的一些概念
1:)成員變量:在類中直接定義的變量叫做成員變量,也可以叫做類的屬性!
2:)局部變量:在一個方法中聲明的變量就是局部變量,它的生命週期是這個方法體內!
注意:如果在一個方法中的變量與類中的成員變量名相同時,默認先在此方法體中找,找到了就調用,找不到調用成員變量!
如果一定要調用類中的成員變量,可以是用this關鍵字進行調用!
3:)對象的建立以及初始化過程
Person p = newPerson()
(1)將Person.class文件加載進內存.
(2)在棧內存空間中開闢一個變量空間p。
(3)在堆內存中給對象分配空間。
(4)給對象中的屬性進行默認初始化。
(5)給對象中的屬性進行顯示初始化。
(6)調用構造代碼塊對對象進行初始化。(執行類中的構造代碼塊,沒有就不執行)
(7)調用對應的構造函數進行對象初始化。對象初始化完畢。
(8)將對象的內存地址賦值給p變量,讓p變量指向該對象。
4:)對象的生命週期
對象的聲明週期由關鍵字new開始,當沒有任何引用指向對象時,對象的生命週期結束,被銷燬!
5:)匿名對象
當一個對象我們只是是用一次的時候,可以把這個對象聲明爲匿名對象,它沒有任何引用,通常作爲一個實參傳給方法!
6:) static 關鍵字
用於修飾成員(成員變量和成員函數)
被修飾後的成員具備以下特點:
• 隨着類的加載而加載,生命週期最長。
• 優先於對象存在
• 被所有對象所共享
• 可以直接被類名調用
使用注意
• 靜態方法只能訪問靜態成員
• 靜態方法中不可以寫this,super關鍵字
• 主函數是靜態的
什麼時候需要使用static修飾:
當類中的成員需要被所有對象共享時,用static修飾。不需要被共享時,就不用static修飾。
簡單說:共性用static修飾,特性不用static修飾。
7:)final可以用來修飾什麼呢?
(1)final可以用來修飾類:被fainl修飾的類不能被繼承。
(2)final可以用來修飾成員方法:被final修飾的成員方法不能被重寫。
(3)final可以用來修飾變量:被final修飾的變量爲常量,值不能被修改。
常量的命名規範:要求大寫。
final int PI = 3.14;
final難道必須聲明的時候就賦值。
一般來說,是這樣的。但是特殊情況:在構造方法可以給final修飾的變量賦值。
五,抽象類和接口
抽象類(abstract)
(1)只抽取了很多類的方法的聲明,爲了保證不出問題,方法聲明用abstract修飾。
(2)抽象類的特點
A:一個類如果有了抽象方法,那麼這個類必須是抽象類。抽象類裏邊可以沒有抽象方法。
B:抽象類是不能夠被實例化的。不能夠創建對象的。
C:如果一個類繼承抽象類,那麼,它要麼實現抽象類中的所有抽象方法,
要麼本身也是抽象類。
(3)抽象類的成員特點:
A:成員變量:子類可以直接繼承抽象類中的成員變量。(抽象類中的成員變量可以和以前是一樣的)
B:成員方法:抽象類中分爲兩種方法,一種是抽象方法,這種方法在子類中必須要被實現。
一種是普通的方法。可以被子類直接繼承使用。
C:構造方法:抽象類不能被實例化,那麼它有構造方法嗎?抽象類是class,那麼它就有構造方法。
它的構造方法有用嗎?有,爲了讓子類實例化的時候使用。
接口(interface)
(1)接口的由來:當一個類中的方法都是抽象的時候,你沒必要定義爲抽象類,
定義爲接口就可以了。
(2)解決了java中只能單繼承的問題。(對多繼承進行了優化)
A:類與類:只能是單繼承。
B:接口與接口:可以是單繼承,也可以是多繼承。
C:類與接口:可以是單實現,也可以是多實現。
(3)成員特點:
A:只有成員變量和成員方法。
B:成員變量默認修飾符 publicstatic final
**int x =20;
**其實是這樣的 public static final int x = 20;
C:成員方法默認修飾符 publicabstract
**voidshow();
**其實是這樣的 public abstract void show();
建議:自己手動加上修飾符。
(4)接口特點:
A:接口是對外暴露的規則
B:接口是功能的擴展
C:接口降低了程序的耦合性。
**內聚(自己實現功能的能力)
**高內聚,低耦合。
舉例:主板和CPU,USB接口,電源插座。
D:擴展說了下接口的理解
**狹義的理解就是java中的接口。
**廣義的理解就是:任何定義的規範都是接口。
(5)接口和抽象類的區別:
A:抽象類只能被單繼承;接口可以被多實現。
B:抽象類中的成員:成員變量:可以是常量,也可以是變量。
成員方法:可以是抽象的,也可以是非抽象的。
構造方法:雖然不可以創建對象,但是可以給子類實例化用。
接口中的成員:成員變量:只能是常量。默認修飾符 public static final
成員方法:只能是抽象的。默認修飾符 public abstract
C:抽象類中定義的是體系結構中的共性的內容。
接口中定義的是對象的擴展功能。
D:抽象類被繼承表示的是:"is a"的關係。xx是yy中的一種。
接口被實現表示的是: "like a"的關係。xx像yy中的一種。
---------------------- android培訓、java培訓、期待與您交流! ----------------------詳細請查看:http://edu.csdn.net/heima