- 相關(guān)推薦
JAVA面向?qū)ο蟮娜筇匦?/p>
每一對(duì)象是其狀態(tài)和行為的封裝。類(lèi)是按一定體系和層次安排的,使得子類(lèi)可以從超類(lèi)繼承行為。在這個(gè)類(lèi)層次體系中有一個(gè)根類(lèi),它是具有一般行為的類(lèi)。Java程序是用類(lèi)來(lái)組織的。下面是小編整理的關(guān)于JAVA面向?qū)ο蟮娜筇匦,希望大家認(rèn)真閱讀!
封裝性
理解封裝性概念
封裝是將代碼及其處理的數(shù)據(jù)綁定在一起的一種編程機(jī)制,該機(jī)制保證了程序(方法)和數(shù)據(jù)(屬性)都不受外部干擾且不被誤用。
理解封裝性的一個(gè)方法就是把它想成一個(gè)黑匣子,它可以阻止在外部定義的代碼隨意訪問(wèn)內(nèi)部代碼和數(shù)據(jù)。對(duì)黑匣子內(nèi)代碼和數(shù)據(jù)的訪問(wèn)通過(guò)一個(gè)適當(dāng)定義的接口嚴(yán)格控制。
如果想與現(xiàn)實(shí)生活中的某個(gè)事物作對(duì)比,可考慮汽車(chē)上的自動(dòng)傳送。自動(dòng)傳送中包含了有關(guān)引擎的數(shù)百比特的信息,例如你正在以什么樣的加速度前進(jìn),你行駛路面的坡度如何,以及目前的檔位。作為用戶(hù),你影響這個(gè)復(fù)雜封裝的方法僅有一個(gè):移動(dòng)檔位傳動(dòng)桿。例如,你不能通過(guò)使用拐彎信號(hào)或擋風(fēng)玻璃擦拭器影響傳動(dòng)。所以檔位傳動(dòng)桿是把你和傳動(dòng)連接起來(lái)的惟一接口。此外,傳動(dòng)對(duì)象內(nèi)的任何操作都不會(huì)影響到外部對(duì)象,例如,檔位傳動(dòng)裝置不會(huì)打開(kāi)車(chē)前燈!因?yàn)樽詣?dòng)傳動(dòng)被封裝起來(lái)了,所以任何一家汽車(chē)制造商都可以選擇一種適合自己的方式來(lái)實(shí)現(xiàn)它。然而,從司機(jī)的觀點(diǎn)來(lái)看,它們的用途都是一樣的。與此相同的觀點(diǎn)能被用于編程。封裝代碼的好處是每個(gè)人都知道怎么訪問(wèn)它,但卻不必考慮它的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),也不必害怕使用不當(dāng)會(huì)帶來(lái)負(fù)面影響。
java封裝的對(duì)象
Java封裝的基本單元是類(lèi)。一個(gè)類(lèi)定義了將被許多對(duì)象共享的屬性和行為方法。這個(gè)類(lèi)的每個(gè)對(duì)象都包含這個(gè)類(lèi)定義的行為和屬性,好像它們是從同一個(gè)類(lèi)的模子中鑄造出來(lái)似的。因?yàn)檫@個(gè)原因,對(duì)象被看作是類(lèi)的實(shí)例,可以說(shuō)類(lèi)是實(shí)例對(duì)象的模板。所以,類(lèi)是一種邏輯結(jié)構(gòu),而對(duì)象是真正存在的物理實(shí)體。
當(dāng)創(chuàng)建一個(gè)類(lèi)時(shí),你要指定組成這個(gè)類(lèi)的屬性和方法。在用Java編寫(xiě)的程序中,方法定義如何使用成員變量。這意味著一個(gè)類(lèi)的行為和接口是通過(guò)方法來(lái)定義的,類(lèi)的這些方法對(duì)它的實(shí)例數(shù)據(jù)進(jìn)行操作。
訪問(wèn)權(quán)限
封裝:隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口。
(1)private(私有變量):只能被定義它的類(lèi)訪問(wèn)。
(2)protected(受保護(hù)變量):可以被定義它的類(lèi)及子孫類(lèi)直接訪問(wèn),也可以由同一包中的其他類(lèi)直接訪問(wèn)。
(3)public(公共變量):可以被任何類(lèi)進(jìn)行訪問(wèn)。
(4)package:可以被定義它的類(lèi)和同一個(gè)包中的其他類(lèi)(包括派生子類(lèi))所訪問(wèn).(包變量在聲明時(shí)常常省略package關(guān)鍵字),在其他包中的子類(lèi)則不能訪問(wèn)父類(lèi)的包變量
既然類(lèi)的目的是封裝復(fù)雜性,在類(lèi)的內(nèi)部就應(yīng)該有隱藏實(shí)現(xiàn)復(fù)雜性機(jī)制。類(lèi)中的每個(gè)方法或變量都可以被標(biāo)記為私有(private)或公共(public)。類(lèi)的公共接口代表類(lèi)的外部用戶(hù)需要知道或可以知道的每件事情;私有方法和數(shù)據(jù)僅能被一個(gè)類(lèi)的成員代碼所訪問(wèn),其他任何不是類(lèi)的成員的代碼都不能訪問(wèn)私有的方法或變量。既然類(lèi)的私有成員僅能被程序中的其他部分通過(guò)該類(lèi)的公共方法訪問(wèn),那么你就能保證不希望發(fā)生的事情就一定不會(huì)發(fā)生。
繼承性
理解繼承性概念
繼承是一個(gè)對(duì)象獲得另一個(gè)對(duì)象的屬性的過(guò)程。
繼承很重要,因?yàn)樗С至税磳臃诸?lèi)的概念。例如,尊貴的獵犬是狗類(lèi)的一部分,狗又是哺乳動(dòng)物類(lèi)的一部分,哺乳動(dòng)物類(lèi)又是動(dòng)物類(lèi)的一部分。如果不使用層級(jí)的概念,我們就不得不分別定義每個(gè)動(dòng)物的所有屬性。使用了繼承,一個(gè)對(duì)象就只需定義使它在所屬類(lèi)中獨(dú)一無(wú)二的屬性即可,因?yàn)樗梢詮乃母割?lèi)那兒繼承所有的通用屬性。所以,可以這樣說(shuō),正是繼承機(jī)制使一個(gè)對(duì)象成為一個(gè)更具通用類(lèi)的一個(gè)特定實(shí)例成為可能。下面讓我們更具體地討論這個(gè)過(guò)程。
一個(gè)深度繼承的子類(lèi)繼承了類(lèi)層級(jí)中它的每個(gè)祖先的所有屬性。繼承性與封裝性相互作用。如果一個(gè)給定的類(lèi)封裝了一些屬性,那么它的任何子類(lèi)將具有同樣的屬性,而且還添加了子類(lèi)自己特有的屬性。新的子類(lèi)繼承它的所有祖先的所有屬性。
(1)復(fù)用其他對(duì)象的代碼有兩種方法:
①. 繼承:是由子對(duì)象完全繼承父對(duì)象的數(shù)據(jù)和操作,”is”的關(guān)系。
②. 包含:把一個(gè)對(duì)象作為另外一個(gè)對(duì)象的一部分,從而達(dá)到復(fù)用的目的,”has”的關(guān)系。
(2)繼承的理解:
①. 繼承是類(lèi)實(shí)現(xiàn)可重用性和可擴(kuò)充性的關(guān)鍵特征,在繼承關(guān)系下類(lèi)之間組成網(wǎng)狀的層次結(jié)構(gòu)。
、. 繼承避免公用代碼的重復(fù)開(kāi)發(fā),減少代碼的冗余。
、. 通過(guò)繼承增強(qiáng)一致性,從而減少模塊間的接口和界面
(3)單繼承(Java支持):
子類(lèi)只能有一個(gè)直接父類(lèi),多繼承(Java不支持):子類(lèi)可以有多個(gè)直接父類(lèi)。
Java不支持類(lèi)的多繼承,但支持接口的多繼承。繼承通過(guò)關(guān)鍵字extends實(shí)現(xiàn)。
(4)變量隱藏:
在子類(lèi)對(duì)父類(lèi)的繼承中,如果子類(lèi)與父類(lèi)的成員變量同名,此時(shí)成為子類(lèi)隱藏(override)了父類(lèi)的成員變量。子類(lèi)若要引用父類(lèi)的同名變量,要用super關(guān)鍵字做前綴加圓點(diǎn)操作符引用,即“super.變量名”。
(5)方法覆蓋:
在子類(lèi)中重寫(xiě)父類(lèi)的方法,它們的名稱(chēng),參數(shù)以及返回類(lèi)型完全相同。通過(guò)改寫(xiě)方法體來(lái)完成不同的功能。注意子類(lèi)方法不能縮小父類(lèi)方法的訪問(wèn)權(quán)限 。
(6)super關(guān)鍵字:
如果子類(lèi)調(diào)用父類(lèi)的構(gòu)造函數(shù),則通過(guò)super()調(diào)用來(lái)實(shí)現(xiàn)。如果子類(lèi)調(diào)用父類(lèi)的同名方法,則通過(guò)super.方法名()來(lái)實(shí)現(xiàn)。
(7)this關(guān)鍵字:
this變量代表對(duì)象本身當(dāng)類(lèi)中有兩個(gè)同名變量,一個(gè)屬于類(lèi)的成員變量,而另一個(gè)屬于某個(gè)特定的方法,使用this區(qū)分成員變量和局部變量,使用this簡(jiǎn)化構(gòu)造函數(shù)的調(diào)用引用自身對(duì)象的成員變量,引用自身對(duì)象的成員方法,調(diào)用自身的構(gòu)造方法–this(參數(shù))
public class Food {
public String feel = "神清氣爽";
public Food() {
this.feel = feel;
}
public void eat() {
System.out.println("食物補(bǔ)充營(yíng)養(yǎng)");
}
}
public class Rice extends Food {
public String feel = "精神飽滿(mǎn)";
public Rice() {
super();
System.out.println("this:" + this.feel);
System.out.println("super:" + super.feel);
super.eat();
this.eat();
}
public void eat() {
System.out.println("米飯補(bǔ)充碳水化合物");
}
public static void main(String[] args) {
new Rice();
}
多態(tài)性
多態(tài)性是允許一個(gè)接口被多個(gè)同類(lèi)動(dòng)作使用的特性,具體使用哪個(gè)動(dòng)作與應(yīng)用場(chǎng)合有關(guān)。
簡(jiǎn)單的理解一下多態(tài),比如:
? 人這個(gè)類(lèi),封裝了很多人類(lèi)共有的特性,
? 教師是人的子類(lèi),繼承了人的屬性與行為,當(dāng)然教師有自己的特征行為,比如教書(shū)授課;
? 學(xué)生是人的子類(lèi),繼承了人的屬性與行為,當(dāng)然學(xué)生有自己的特征行為,比如學(xué)習(xí)做作業(yè);
基于抽象類(lèi)說(shuō)明多態(tài)性
public abstract class Human {
private int age;
private double height;
private int sex;
public abstract void doThing();
}
public class Teacher extends Human {
public void teach() {
}
public void doThing() {
System.out.println("授課");
}
}
public class Student extends Human {
public void doThing() {
System.out.println("做作業(yè)");
}
}
public class App {
public static void main(String[] args) {
Teacher teacher = new Teacher();
Student student = new Student();
teacher.doThing();
student.doThing();
}
}
現(xiàn)在,當(dāng)我們需要去描述教師與學(xué)生各自的行為的時(shí)候, 我們可以分開(kāi)來(lái)說(shuō)“教師在授課”, “學(xué)生做作業(yè)”, 但如果我們要站在抽象的角度, 也就是從教師與學(xué)生的父類(lèi)”人”的角度, 來(lái)同時(shí)描述他們各自的行為時(shí),我們?cè)趺疵枋?”人在授課”?”人在做作業(yè)”?這是不是怪怪的很不合適?不合適的問(wèn)題就在于, 對(duì)于行為主體,我們使用了抽象層次的東東”人”,而對(duì)于行為本身, 我們卻使用了具體的東東”授課”與”教書(shū)”. 怎么解決呢? 那就需要解決抽象與具體的矛盾問(wèn)題.
既然是站在抽象在角度來(lái)描述,那我們把行為抽象一下,不就能同時(shí)描述了嗎?比如”人在做事”(教師授課與學(xué)生做作業(yè)都可以說(shuō)成人在做事),這樣就解決了抽象層次與具體層次之間的矛盾.
到了這一步, 我們可以把兩個(gè)描述: “教師在做事”,”學(xué)生在做事” ,兩者統(tǒng)一為”人在做事”,然后, 我們可以在”教師”的”做事”行為中去調(diào)用教師自己的特征行為”授課”在”學(xué)生”的”做事”行為中去調(diào)用學(xué)生自己的特征行為”做作業(yè)”, 所以,當(dāng)調(diào)用”人”去”做事”的時(shí)候,如果這個(gè)人是教師,那他所做的事實(shí)際上就是”教書(shū)”,如果這個(gè)人是學(xué)生,那他所做的事實(shí)際上就是”做作業(yè)”.也就是說(shuō)在這里”人”是多態(tài)的, 在不同的形態(tài)時(shí),特征行為是不一樣的, 這里的”人”, 同時(shí)有兩種形態(tài),一種是教師形態(tài),一種是學(xué)生形態(tài),所對(duì)應(yīng)的特征行為分別是”授課”與”做作業(yè)”.完成上述的描述過(guò)程, 其實(shí)就是多態(tài)機(jī)制的體現(xiàn).
多態(tài), 就是站在抽象的層面上去實(shí)施一個(gè)統(tǒng)一的行為,到個(gè)體(具體)的層面上時(shí), 這個(gè)統(tǒng)一的行為會(huì)因?yàn)閭(gè)體(具體)的形態(tài)特征而實(shí)施自己的特征行為.
【JAVA面向?qū)ο蟮娜筇匦浴肯嚓P(guān)文章:
2016年java面向?qū)ο缶幊填}庫(kù)及答案03-19
javascript面向?qū)ο笾械膶?duì)象怎么理解03-30
JAVA認(rèn)證開(kāi)源技術(shù):關(guān)于Java的對(duì)象equals方法03-04
色彩的基本特性03-12
項(xiàng)目管理特性03-18
學(xué)習(xí)Java的技巧03-05
java習(xí)題及答案03-26
JAVA認(rèn)證簡(jiǎn)介03-19