摘要:面向?qū)ο缶幊趟枷朊嫦驅(qū)ο螅唵蝸碚f就是由動作的執(zhí)行者變?yōu)閯幼鞯牟倏卣摺C嫦驅(qū)ο笫窍鄬τ诿嫦蜻^程的。面向?qū)ο笕筇卣髅嫦驅(qū)ο笥腥筇卣鳎捶庋b繼承和多態(tài)。接口和抽象類接口接口名方法方法,默認(rèn)修飾符為,不能用其他修飾符修飾接口。
面向?qū)ο缶幊趟枷?/b>
面向?qū)ο螅唵蝸碚f就是由動作的執(zhí)行者變?yōu)閯幼鞯牟倏卣摺=Y(jié)合具體例子來說就是使用某個人或者工具所具有的功能而不用去管功能的具體實現(xiàn)方式。例如現(xiàn)實中的項目開發(fā),老板想要實現(xiàn)某些功能,但是他自己不會這些技術(shù),所以他就會讓員工去做這些事情,通過借助別的擁有你想要實現(xiàn)某些功能的過程就可以理解為面向?qū)ο蟆C嫦驅(qū)ο笫窍鄬τ诿嫦蜻^程的。
類與對象
接著來了解下什么是 類與對象,世界是由什么組成的?我們這樣考慮,世界是由動物、植物等組成的,動物又分為哺乳動物和非哺乳動物,哺乳動物又分為老虎、獅子、大象... ...可以繼續(xù)分類下去。通過這個例子我們對人類進行分析,人都會直立行走、會說話、有兩個眼睛一個鼻子、會使用工具、會勞動、會創(chuàng)造工具等特征,這就是人區(qū)別于其他動物的原因,當(dāng)某個事物符合了人所具有的所有特征,我們就說他是一個人,老虎、獅子、海豚等不具備”人類“的某些特征,所以它們不是人。但是要注意:類不是具體的事物,而是由個體組成的集合。這樣的個體就叫做對象。
所以,類描述了一組有相同特性(屬性)和相同行為(方法)的對象。
面向?qū)ο笕筇卣?/strong>
面向?qū)ο笥腥筇卣鳎?strong>封裝、繼承和多態(tài)。
封裝
封裝,也就是隱藏,隱藏對象功能的實現(xiàn)細(xì)節(jié)和屬性或者不需要用戶知道的內(nèi)容,只提供與外部聯(lián)系的接口供用戶使用。
封裝的好處
1、減少代碼的耦合性,使代碼更加精簡。
2、提高代碼的復(fù)用性,不必再重復(fù)寫功能相近的代碼。
封裝的具體實現(xiàn)就是將某一功能或?qū)傩猿殡x出來,獨立寫成多帶帶的方法或類,對類及其屬性和方法設(shè)置訪問權(quán)限限定該功能或?qū)傩钥梢员惶囟ǖ脑L問者訪問,訪問權(quán)限有public、protected、private和默認(rèn)。
public:在任何類中都能訪問,即使不在同一包中。
protected:只能在本包和子類中訪問,即使子類不和父類在同一包中,也能訪問到。
private:只能在本類中被訪問,子類也訪問不到。
默認(rèn):只能在同一個包中被訪問到。
注意:類只能訪問其他類的public和protected修飾的屬性和方法,不能訪問到private修飾的。
來看具體例子:
public class Person { private String name; private int age; private String id; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
這個簡單的例子把人屬性封裝了進去,外部只能調(diào)用相應(yīng)的get和set方法來對屬性進行操作。
繼承
假設(shè)在描述某些事物的時候我們會發(fā)現(xiàn)他們具有許多相同的地方,例如鳥類,每種鳥都有眼睛,嘴巴,都會吃東西等,這些相同的地方可以把他們抽取出來定義成一個鳥類,當(dāng)需要描述多種鳥時就不用再重復(fù)定義這些共性,直接繼承鳥類即可,不必再重新續(xù)寫重復(fù)內(nèi)容。
注意:Java的繼承不是像C++一樣,Java只存在單繼承且智只能繼承父類的非私有成員,使用extends ,在調(diào)用子類構(gòu)造方法時會調(diào)用父類無參構(gòu)造方法,若父類沒有無參構(gòu)造,注意為其添加無參構(gòu)造方法。super()方法可調(diào)用父類方法或變量。繼承提高了程序的復(fù)用性、擴展性,也是 多態(tài)特征的前提。
super和this的區(qū)別:
super(參數(shù)):調(diào)用父類的某一構(gòu)造函數(shù)
super.方法:調(diào)用父類中的方法;
super.變量名:調(diào)用父類中的變量
this:代表當(dāng)前對象名
this與super如果要在構(gòu)造函數(shù)里使用則都必須在構(gòu)造函數(shù)的第一行,所以不能同時存在與構(gòu)造函數(shù)里。
因為static不包含對象,this和super代表對象,所以不能在static域中使用super和this。
接口和抽象類
接口:interface 接口名{方法1;方法2…},默認(rèn)修飾符為 public ,不能用其他修飾符修飾接口。
抽象類:當(dāng)多個類都存在相同方法名,但是其實現(xiàn)方式卻不相同時可以將它們進行抽取,定義成一個類,只有方法名沒有具體實現(xiàn),abstract class 類名{ abstract void…方法名();}
注意:僅實現(xiàn)抽象類的部分功能的類還是抽象類。抽象類除了不能被實例化外和正常類沒什么區(qū)別。
接口與抽象類的區(qū)別:接口可以被實現(xiàn)多個中間用逗號隔開,使用 implements 關(guān)鍵字實現(xiàn)接口,實現(xiàn)了接口類必須全部實現(xiàn)接口中的方法。如果基本功能在不斷改變,那么就需要使用抽象類。如果不斷改變基本功能并且使用接口,那么就需要改變所有實現(xiàn)了該接口的類。抽象類可以提供成員方法的實現(xiàn)細(xì)節(jié),而接口中只能存在public abstract 方法;抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的;繼承抽象類如果不實現(xiàn)所有的抽象方法,子類必須聲明為抽象類。
java不支持多繼承,但是可以實現(xiàn)多個接口,形如
class Main extends A implements B,C...{ }
稍微注意下,接口之間也可以繼承,而且是可以多繼承(了解一下就行了,基本不提這個)。
多態(tài)
多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。
多態(tài)存在的三個必要條件
繼承
重寫
父類引用指向子類對象
java的多態(tài)中涉及到向上轉(zhuǎn)型和向下轉(zhuǎn)型。
Father f = new Child();
上面的例子為向上轉(zhuǎn)型,父類引用指向子類對象。
Father f = new Child(); Child c = (Child) f;
向下轉(zhuǎn)型即當(dāng)我們有一個父類對象時,我們想要實現(xiàn)子類中的某些方法功能時就需要向下轉(zhuǎn)型,上面的例子為向下轉(zhuǎn)型。
用一個具體的實例說明向上轉(zhuǎn)型與向下轉(zhuǎn)型
abstract class Animal{ public abstract void eat(); public abstract void sleep(); } class Cat extends Animal{ public void eat() { System.out.println("貓吃魚"); } public void sleep() { System.out.println("貓睡覺"); } public void ability() { System.out.println("貓抓老鼠"); } } class Dog extends Animal { public void eat() { System.out.println("狗吃骨頭"); } public void sleep() { System.out.println("狗睡覺"); } public void ability() { System.out.println("狗看家"); } } public class DuoTai{ public static void main(String[] args){ Animal a = new Cat();//自動向上轉(zhuǎn)型 a.sleep(); //Animal 類中定義了此方法,而子類中也重寫了此方法,調(diào)用的是子類中的sleep()方法 a.eat(); //a.ability(); 編譯失敗,因為 a是父類Animal類的引用,而Animal類中未定義此方法,所以會報錯 getAbility(a); } public static void getAbility(Animal a){ if(a instanceof Cat) { Cat c = (Cat) a;//向下轉(zhuǎn)型,使用instanceof關(guān)鍵字判斷是否是指定類的對象 c.ability(); } if(a instanceof Dog){ Dog d = (Dogs) a; d.ability(); } } } /** * 執(zhí)行結(jié)果為: * 貓睡覺 * 貓吃魚 * 貓抓老鼠 */
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/77402.html
摘要:面向?qū)ο蟮娜筇卣鞣庋b繼承多態(tài)。以本文為例,類中的變量為私有變量,只能通過創(chuàng)建對象此時構(gòu)造方法自動調(diào)用來賦值。 java面向?qū)ο蟮娜筇卣鳎悍庋b、繼承、多態(tài)。 以本文為例,User類中的變量為私有變量,只能通過創(chuàng)建對象(此時構(gòu)造方法自動調(diào)用)來賦值。外界只能通過公有方法api()來訪問User類。 Admin類繼承了User類,調(diào)用了其構(gòu)造方法,還重寫了method_1方法,增加了...
摘要:什么是面向?qū)ο蟊疚牟辉谡撌觥=酉聛碚f一下面向?qū)ο蟮娜筇卣髟诋?dāng)中的實現(xiàn)。封裝實現(xiàn)封裝實現(xiàn)就是是對象內(nèi)部的變化對外界是透明的不可見。這種做法使對象之間低耦合便于維護升級團隊協(xié)作開發(fā)。。 概述 本來打算寫設(shè)計模式的,在談?wù)搄s的設(shè)計模式之前先說一下js的面向?qū)ο?因為很多設(shè)計模式的實現(xiàn)都摻雜著面向?qū)ο蟮乃枷?所以先做一下前期鋪墊。 js我們都知道是一種動態(tài)類型腳本型語言,變量類型無法保證,...
摘要:二封裝封裝性就是把類對象的屬性和行為結(jié)合成一個獨立的相同單位,并盡可能隱蔽類對象的內(nèi)部細(xì)節(jié),對外形成一個邊界,只保留有限的對外接口使之與外部發(fā)生聯(lián)系。 javascript的面向?qū)ο?面向?qū)ο蟮奶攸c分為三類:繼承 封裝 多態(tài) 首先你得理解面向過程:假如把一件東西放到一個箱子里,面向過程就是第一部打開箱子,然后把東西放進去,然后關(guān)閉箱子: 面向?qū)ο?就是把箱子看成一個對象,這個...
閱讀 3109·2023-04-25 15:44
閱讀 1881·2019-08-30 13:11
閱讀 2841·2019-08-30 11:11
閱讀 3011·2019-08-29 17:21
閱讀 1312·2019-08-29 15:38
閱讀 903·2019-08-29 12:49
閱讀 1801·2019-08-28 18:19
閱讀 3229·2019-08-26 14:01