面向?qū)ο缶幊?/h2>

一、面向?qū)ο蟮娜筇匦裕?/h1>

1)、面向?qū)ο?/p>

面向?qū)ο笫且环N程序設(shè)計思想,計算機程序的設(shè)計實質(zhì)上就是將現(xiàn)實中的一些事物的特征抽離出來描述成一些計算機事件的過程,這種抽象的過程中,我們把具體的事物封裝成一個一個的整體進行描述,使被描述的對象具備一些系統(tǒng)性、整體性的的行為和特征,我們把這種設(shè)計思想稱為面向?qū)ο蟆?/p>

2)、面向?qū)ο笈c面向過程

2.1)、面向過程是早期的程序語言設(shè)計思想,該思想強調(diào)事物的行為細(xì)節(jié),即程序的設(shè)計不需要封裝成一個個的整體,而是將整個程序描述成一個行為,所有行為細(xì)節(jié)都按照固定方式一步一步的執(zhí)行,執(zhí)行程序就是執(zhí)行某一行為的過程。

2.2)、面向?qū)ο蠛兔嫦蜻^程都是一種思想,面向?qū)ο笫窍鄬τ诿嫦蜻^程而言的,

面向過程強調(diào)的是具體的功能行為,而面向?qū)ο髮⒐δ芊庋b進對象,強調(diào)具備了功能的對象,面向?qū)ο笫腔诿嫦蜻^程的,但面向?qū)ο笏枷敫咏诂F(xiàn)實場景。

三大特性

封裝和繼承幾乎都是為多態(tài)而準(zhǔn)備的

一)、封裝

首先,屬性能夠描述事物的特征,方法能夠描述事物的動作。封裝就是把同一類事物的共性(包括屬性和方法)歸到同一類中,方便使用。

封裝:封裝也稱信息隱藏,是指利用抽象數(shù)據(jù)類型把數(shù)據(jù)和基于數(shù)據(jù)的操作封裝起來,使其成為一個不可分割的整體,數(shù)據(jù)隱藏在抽象數(shù)據(jù)內(nèi)部,盡可能的隱藏數(shù)據(jù)細(xì)節(jié),只保留一些接口使其與外界發(fā)生聯(lián)系。也就是說用戶無需知道內(nèi)部的數(shù)據(jù)和方法的具體實現(xiàn)細(xì)節(jié),只需根據(jù)留在外部的接口進行操作就行。

封裝的好處:

1)實現(xiàn)了專業(yè)的分工

2)良好的封裝能夠減少耦合

3)類內(nèi)部的結(jié)構(gòu)能夠自有修改

4)可以對成員進行更精確的控制

5)隱藏信息,實現(xiàn)細(xì)節(jié)

封裝的步驟

1)修改屬性的可見性來限制對屬性的訪問

2)為每個屬性創(chuàng)建一隊賦值和取值方法,用于對這些屬性的訪問

3)在賦值和取值方法中,加入對屬性的存取限制

為了實現(xiàn)良好的封裝,我們通常將類的成員變量聲明為private,在通過public方法來對這個變量來訪問。對一個變量的操作,一般有讀取和賦值2個操作,,我們分別定義2個方法來實現(xiàn)這2個操作,一個是getXX(XX表示要訪問的成員變量的名字)用來讀取這個成員變量,另一個是setXX()用來對這個變量賦值。

二)、繼承

1. ????????Java繼承

Java繼承是面向?qū)ο蟮淖铒@著的一個特征。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性和行為,并能擴展新的能力。JAVA不支持多繼承,單繼承使JAVA的繼承關(guān)系很簡單,一個類只能有一個父類,易于管理程序,父類是子類的一般化,子類是父類的特化(具體化)

繼承所表達(dá)的就是一種對象類之間的相交關(guān)系,它使得某類對象可以繼承另外一類對象的數(shù)據(jù)成員和成員方法。若類B繼承類A,則屬于B的對象便具有類A的全部或部分性質(zhì)(數(shù)據(jù)屬性)和功能(操作),我們稱被繼承的類A為基類、父類或超類,而稱繼承類B為A的派生類或子類。

繼承避免了對一般類和特殊類之間共同特征進行的重復(fù)描述。同時,通過繼承可以清晰地表達(dá)每一項共同特征所適應(yīng)的概念范圍——在一般類中定義的屬性和操作適應(yīng)于這個類本身以及它以下的每一層特殊類的全部對象。運用繼承原則使得系統(tǒng)模型比較簡練也比較清晰。

2. ????????Java繼承的特征

1)繼承關(guān)系是傳遞的。若類C繼承類B,類B繼承類A(多繼承),則類C既有從類B那里繼承下來的屬性與方法,也有從類A那里繼承下來的屬性與方法,還可以有自己新定義的屬性和方法。繼承來的屬性和方法盡管是隱式的,但仍是類C的屬性和方法。

2)繼承提供了軟件復(fù)用功能。若類B繼承類A,那么建立類B時只需要再描述與基類(類A)不同的少量特征(數(shù)據(jù)成員和成員方法)即可。這種做法能減小代碼和數(shù)據(jù)的冗余度,大大增加程序的重用性。

3)繼承通過增強一致性來減少模塊間的接口和界面,大大增加了程序的易維護性。

繼承的作用:

(1)父類具備的方法子類可以直接繼承過來,不用重新書寫,提高了代碼的復(fù)用性

(2)讓類與類之間產(chǎn)生關(guān)系,有了關(guān)系才有多態(tài)的實現(xiàn)

(3)Java中只支持單繼承,不支持多繼承,因為多繼承存在安全隱患(當(dāng)多個父類存在同個功能時,子類不確定要運行哪一個),Java支持多層繼承,即父類還可以繼承其他類,java用另一種機制解決單繼承的局限性,即多實現(xiàn)

繼承的特點

覆蓋(重寫)

如果子父類中的成員一致時,子類成員會覆蓋父類成員

當(dāng)子類繼承父類時,沿襲父類的功能到子類中,但子類對該功能的實現(xiàn)細(xì)節(jié)不一致,子類可以保留父類對該功能的定義,重寫功能的內(nèi)容

覆蓋與重載:重載只看參數(shù)列表,其他一致參數(shù)列表不一致為重載,而重寫子父類的參數(shù)必須要一致

this與super

this表示當(dāng)前對象的引用,super表示當(dāng)前對象父類的引用

子父類中的構(gòu)造函數(shù)

構(gòu)造函數(shù)不能重寫

構(gòu)造函數(shù)第一行有一條隱式的語句super()/this()

在對子類對象進行初始化時,父類構(gòu)造函數(shù)也會運行,因為子類中的構(gòu)造函數(shù)默認(rèn)第一行有一條隱式的super()語句,這樣方便子類構(gòu)造時先獲取到父類的共性屬性

super()一定要定義在子類構(gòu)造函數(shù)的第一行,當(dāng)沒有默認(rèn)的空參數(shù)構(gòu)造函數(shù),要手動指定

注意事項:

千萬別為了獲取其他類中的功能而繼承,必須是類與類間有所屬關(guān)系才可以繼承。

子類覆蓋父類時必須保證子類權(quán)限大于等于父類,才可以覆蓋,否則編譯失敗

子類靜態(tài)成員只能覆蓋父類靜態(tài)成員

?final關(guān)鍵字

final關(guān)鍵字可以修飾類、函數(shù)和變量

被final修飾的類不可以被繼承

被final修飾的方法不可以被復(fù)寫

被final修飾的變量只能被賦值一次,既可以修飾成員變量,也可以修飾局部變量;


Object

java中有一個特殊的類,Object類,它是所有對象的超類(根類),Object類中定義了所有對象的共性成員

Object類中的方法

equals()?比較兩個對象是否相同

toString()?返回該對象的字符串表示形式

getClass()?獲取該對象對應(yīng)的字節(jié)碼文件對象

hasCode()?獲取該對象的哈希碼值

類間的體系關(guān)系

繼承、聚集(聚合)、組合

繼承:

指的是一個類繼承另外的一個類的功能,并增加它自己的新功能或改寫舊有功能的具體實現(xiàn),繼承是類與類之間最常見的關(guān)系。

聚合:

指的是整體與部分的關(guān)系。通常在定義一個整體類后,再去分析這個整體類的組成結(jié)構(gòu)。從而找出一些組成類,該整體類和組成類之間就形成了聚合關(guān)系。例如足球隊中的足球隊員就是聚合關(guān)系。

組合:

也表示類之間整體和部分的關(guān)系,但是組合關(guān)系中部分和整體具有統(tǒng)一的生存期。一旦整體對象不存在,部分對象也將不存在。部分對象與整體對象之間具有共生死的關(guān)系。例如人的各個身體器官之間的關(guān)系。


三)、多態(tài)

  方法的重寫、重載與動態(tài)連接構(gòu)成多態(tài)性;

  Java之所以引入多態(tài)的概念,原因之一是它在類的繼承問題上和C++不同,后者允許多繼承,這確實給其帶來的非常強大的功能,但是復(fù)雜的繼承關(guān)系也給C++開發(fā)者帶來了更大的麻煩,為了規(guī)避風(fēng)險,Java只允許單繼承,派生類與基類間有IS-A的關(guān)系(即“貓”is a “動物”)。這樣做雖然保證了繼承關(guān)系的簡單明了,但是勢必在功能上有很大的限制,所以,Java引入了多態(tài)性的概念以彌補這點的不足,此外,抽象類和接口也是解決單繼承規(guī)定限制的重要手段。同時,多態(tài)也是面向?qū)ο缶幊痰木杷凇?/p>

  要理解多態(tài)性,首先要知道什么是“向上轉(zhuǎn)型”。

  我定義了一個子類Cat,它繼承了Animal類,那么后者就是前者的父類。我可以通過

  Cat c = new Cat();例化一個Cat的對象,這個不難理解。

  但當(dāng)我這樣定義時:Animal a = new Cat();

  這代表什么意思呢?

  很簡單,它表示我定義了一個Animal類型的引用,指向新建的Cat類型的對象。由于Cat是繼承自它的父類Animal,所以Animal類型的引用是可以指向Cat類型的對象的。那么這樣做有什么意義呢?因為子類是對父類的一個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特,定義一個父類類型的引用指向一個子類的對象既可以使用子類強大的功能,又可以抽取父類的共性。所以,

  父類引用只能調(diào)用父類中存在的方法和屬性,不能調(diào)用子類的擴展部分;因為父類引用指向的是堆中子類對象繼承的父類;(但是如果強制把超類轉(zhuǎn)換成子類的話,就可以調(diào)用子類中新添加而超類沒有的方法了。)

  同時,父類中的一個方法只有在父類中定義而在子類中沒有重寫的情況下,才可以被父類類型的引用調(diào)用;

  對于父類中定義的方法,如果子類中重寫了該方法,那么父類類型的引用將會調(diào)用子類中的這個方法,這就是動態(tài)連接。


多態(tài)的分類

二、類與對象的關(guān)系?

對象:是具體的事物。

類:是對對象的抽象。

先有具體的對象,然后抽象各個對象之間象的部分,歸納出來類,通過類再認(rèn)識其他對象。

對象是類的實例化。將對象的公有的功能和屬性抽象出來成為一類的具有普遍行為和屬性的類。


三、類的組成部分?

成員變量、成員方法、構(gòu)造器、代碼塊

四、重載與重寫的區(qū)別?


重載是方法名相同,但形參不同(形參個數(shù)或者形參類型),與方法的修飾符與返回值類型無關(guān)。它是在一個類中,而重寫是在一個子類中,因為重寫的前提是要有繼承。

五、四種訪問修飾符?


訪問修飾符的訪問權(quán)限

六、內(nèi)部類?


Java中的內(nèi)部類共分為四種:

靜態(tài)內(nèi)部類static inner class (also called nested class)

成員內(nèi)部類member inner class

局部內(nèi)部類local inner class

匿名內(nèi)部類anonymous inner class

靜態(tài)內(nèi)部類Static Inner Class

最簡單的內(nèi)部類形式。

類定義時加上static關(guān)鍵字。

不能和外部類有相同的名字。

被編譯成一個完全獨立的.class文件,名稱為OuterClass$InnerClass.class的形式。

只可以訪問外部類的靜態(tài)成員和靜態(tài)方法,包括了私有的靜態(tài)成員和方法。

生成靜態(tài)內(nèi)部類對象的方式為:  OuterClass.InnerClass inner = new OuterClass.InnerClass();

成員內(nèi)部類Member Inner Class

成員內(nèi)部類也是定義在另一個類中,但是定義時不用static修飾。

成員內(nèi)部類和靜態(tài)內(nèi)部類可以類比為非靜態(tài)的成員變量和靜態(tài)的成員變量。

成員內(nèi)部類就像一個實例變量?! ∷梢栽L問它的外部類的所有成員變量和方法,不管是靜態(tài)的還是非靜態(tài)的都可以。

在外部類里面創(chuàng)建成員內(nèi)部類的實例:  this.new Innerclass();

在外部類之外創(chuàng)建內(nèi)部類的實例:  (new Outerclass()).new Innerclass();

在內(nèi)部類里訪問外部類的成員:  Outerclass.this.member


方法內(nèi)部類Local Inner Class


匿名內(nèi)部類Anonymous Inner Class  匿名內(nèi)部類就是沒有名字的局部內(nèi)部類,不使用關(guān)鍵字class, extends, implements,沒有構(gòu)造方法。  匿名內(nèi)部類隱式地繼承了一個父類或者實現(xiàn)了一個接口?! ∧涿麅?nèi)部類使用得比較多,通常是作為一個方法參數(shù)?! ∩傻?class文件中,匿名類會生成OuterClass$1.class文件,數(shù)字根據(jù)是第幾個匿名類而類推。

七、接口與抽象類的區(qū)別?


八、this關(guān)鍵字?

this表示當(dāng)前對象的引用,super表示當(dāng)前對象父類的引用

This可以修飾方法、屬性或構(gòu)造器。



九、super關(guān)鍵字?

this表示當(dāng)前對象的引用,super表示當(dāng)前對象父類的引用

Super對父類方法、屬性或構(gòu)造器的引用。

總結(jié):(存在繼承關(guān)系的前提下)在使用有參構(gòu)造器實例化子類的對象時,需要為子類的構(gòu)造器傳入?yún)?shù),而在子類構(gòu)造器發(fā)揮作用之前,父類的構(gòu)造器也要使用參數(shù)進行實例化,所以需要同時傳入父類的參數(shù)的值,這也就解釋了我為何要在子類的有參構(gòu)造器中寫入了父類構(gòu)造器的參數(shù)了。(當(dāng)然也可以不這么做,另外一種方式把父類有參數(shù)構(gòu)造器中的參數(shù)定義為static的變量,然后在super()中將其名稱寫入,也可以達(dá)到一樣的效果)


十、static關(guān)鍵字?


十一、什么是值傳遞?什么是引用傳遞?

????????首先要說明的是java中是沒有指針的,java中只存在值傳遞,只存在值傳遞?。?! ?然而我們經(jīng)??吹綄τ趯ο螅〝?shù)組,類,接口)的傳遞似乎有點像引用傳遞,可以改變對象中某個屬性的值。但是不要被這個假象所蒙蔽,實際上這個傳入函數(shù)的值是對象引用的拷貝,即傳遞的是引用的地址值,所以還是按值傳遞。


代碼


內(nèi)存分析


代碼


內(nèi)存分析


代碼


內(nèi)存分析


代碼

String是final修飾的,不可變的。

十二、是否可以在static環(huán)境中訪問非static變量或方法?

不能:

static變量在java中是屬于類的,在類的所有實例中,它的值都是一樣的。在類被JVM載入時,靜態(tài)變量的值就確定了。

而非靜態(tài)變量是屬于實例的,要在new一個實例之后,值才會存在。

在static環(huán)境中,調(diào)用非static變量,可能這個變量都還不存在,當(dāng)然會出錯。

詳細(xì)回答:

不可以,在static環(huán)境中,不可以訪問非static。因為靜態(tài)的成員屬于類,隨著類的加載而加載到靜態(tài)方法區(qū)內(nèi)存,當(dāng)類加載時,此時不一定有實例創(chuàng)建,沒有實例,就不可以訪問非靜態(tài)的成員。類的加載先于實例的創(chuàng)建,因此靜態(tài)環(huán)境中,不可以訪問非靜態(tài)!

十三、什么是自動拆箱跟自動裝箱?

Java 1.5中引入了自動裝箱和拆箱機制:

(1)自動裝箱:把基本類型用它們對應(yīng)的引用類型包裝起來,使它們具有對象的特質(zhì),可以調(diào)用toString()、hashCode()、getClass()、equals()等方法。

? 如下:

Integer a=3;//這是自動裝箱

? ? ? ? 其實編譯器調(diào)用的是static Integer valueOf(int i)這個方法,valueOf(int i)返回一個表示指定int值的Integer對象,那么就變成這樣:?

Integer a=3;=>Integer a=Integer.valueOf(3);

(2)拆箱:跟自動裝箱的方向相反,將Integer及Double這樣的引用類型的對象重新簡化為基本類型的數(shù)據(jù)。

? ? ? ? ?如下:

? ? ?int?i = new Integer(2);//這是拆箱

? ? 編譯器內(nèi)部會調(diào)用int intValue()返回該Integer對象的int值

? ?注意:自動裝箱和拆箱是由編譯器來完成的,編譯器會在編譯期根據(jù)語法決定是否進行裝箱和拆箱動作。

http://blog.csdn.net/jackiehff/article/details/8509056

十四、java中,什么是構(gòu)造函數(shù)?什么是構(gòu)造函數(shù)重載?什么是復(fù)制構(gòu)造函數(shù)?構(gòu)造函數(shù)能否被重寫?

當(dāng)新對象被創(chuàng)建的時候,構(gòu)造函數(shù)(與類名相同,public修飾的函數(shù))會被調(diào)用。每一個類都有構(gòu)造函數(shù)。在程序員沒有給類提供構(gòu)造函數(shù)的情況下,Java編譯器會為這個類創(chuàng)建一個默認(rèn)的構(gòu)造函數(shù)。

Java中構(gòu)造函數(shù)重載和方法重載很相似。可以為一個類創(chuàng)建多個構(gòu)造函數(shù)。每一個構(gòu)造函數(shù)必須有它自己唯一的參數(shù)列表。

Java不支持像C++中那樣的復(fù)制構(gòu)造函數(shù),這個不同點是因為如果你不自己寫構(gòu)造函數(shù)的情況下,Java不會創(chuàng)建默認(rèn)的復(fù)制構(gòu)造函數(shù)。

不能被重寫,但是能被重載,因為構(gòu)造器不能被繼承。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容