一沥潭、面向?qū)ο蟮娜筇匦裕?/h1>
1)、面向?qū)ο?/p>
面向?qū)ο笫且环N程序設(shè)計思想与学,計算機(jī)程序的設(shè)計實質(zhì)上就是將現(xiàn)實中的一些事物的特征抽離出來描述成一些計算機(jī)事件的過程谱煤,這種抽象的過程中摊求,我們把具體的事物封裝成一個一個的整體進(jìn)行描述,使被描述的對象具備一些系統(tǒng)性刘离、整體性的的行為和特征室叉,我們把這種設(shè)計思想稱為面向?qū)ο蟆?/p>
2)睹栖、面向?qū)ο笈c面向過程
2.1)、面向過程是早期的程序語言設(shè)計思想茧痕,該思想強(qiáng)調(diào)事物的行為細(xì)節(jié)磨淌,即程序的設(shè)計不需要封裝成一個個的整體,而是將整個程序描述成一個行為凿渊,所有行為細(xì)節(jié)都按照固定方式一步一步的執(zhí)行,執(zhí)行程序就是執(zhí)行某一行為的過程缚柳。
2.2)埃脏、面向?qū)ο蠛兔嫦蜻^程都是一種思想,面向?qū)ο笫窍鄬τ诿嫦蜻^程而言的秋忙,
面向過程強(qiáng)調(diào)的是具體的功能行為彩掐,而面向?qū)ο髮⒐δ芊庋b進(jìn)對象,強(qiáng)調(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ù)留在外部的接口進(jìn)行操作就行力惯。
封裝的好處:
1)實現(xiàn)了專業(yè)的分工
2)良好的封裝能夠減少耦合
3)類內(nèi)部的結(jié)構(gòu)能夠自有修改
4)可以對成員進(jìn)行更精確的控制
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ù)屬性和行為汽馋,并能擴(kuò)展新的能力。JAVA不支持多繼承圈盔,單繼承使JAVA的繼承關(guān)系很簡單豹芯,一個類只能有一個父類,易于管理程序驱敲,父類是子類的一般化铁蹈,子類是父類的特化(具體化)
繼承所表達(dá)的就是一種對象類之間的相交關(guān)系,它使得某類對象可以繼承另外一類對象的數(shù)據(jù)成員和成員方法众眨。若類B繼承類A握牧,則屬于B的對象便具有類A的全部或部分性質(zhì)(數(shù)據(jù)屬性)和功能(操作),我們稱被繼承的類A為基類娩梨、父類或超類沿腰,而稱繼承類B為A的派生類或子類。
繼承避免了對一般類和特殊類之間共同特征進(jìn)行的重復(fù)描述狈定。同時矫俺,通過繼承可以清晰地表達(dá)每一項共同特征所適應(yīng)的概念范圍——在一般類中定義的屬性和操作適應(yīng)于這個類本身以及它以下的每一層特殊類的全部對象。運(yùn)用繼承原則使得系統(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)繼承通過增強(qiáng)一致性來減少模塊間的接口和界面,大大增加了程序的易維護(hù)性。
繼承的作用:
(1)父類具備的方法子類可以直接繼承過來绍填,不用重新書寫霎桅,提高了代碼的復(fù)用性
(2)讓類與類之間產(chǎn)生關(guān)系,有了關(guān)系才有多態(tài)的實現(xiàn)
(3)Java中只支持單繼承讨永,不支持多繼承滔驶,因為多繼承存在安全隱患(當(dāng)多個父類存在同個功能時,子類不確定要運(yùn)行哪一個)卿闹,Java支持多層繼承揭糕,即父類還可以繼承其他類,java用另一種機(jī)制解決單繼承的局限性锻霎,即多實現(xiàn)
繼承的特點(diǎ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()
在對子類對象進(jìn)行初始化時冬殃,父類構(gòu)造函數(shù)也會運(yùn)行,因為子類中的構(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++不同挎塌,后者允許多繼承,這確實給其帶來的非常強(qiáng)大的功能内边,但是復(fù)雜的繼承關(guān)系也給C++開發(fā)者帶來了更大的麻煩榴都,為了規(guī)避風(fēng)險,Java只允許單繼承漠其,派生類與基類間有IS-A的關(guān)系(即“貓”is a “動物”)嘴高。這樣做雖然保證了繼承關(guān)系的簡單明了,但是勢必在功能上有很大的限制和屎,所以拴驮,Java引入了多態(tài)性的概念以彌補(bǔ)這點(diǎn)的不足,此外柴信,抽象類和接口也是解決單繼承規(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類型的對象的。那么這樣做有什么意義呢刻蟹?因為子類是對父類的一個改進(jìn)和擴(kuò)充逗旁,所以一般子類在功能上較父類更強(qiáng)大,屬性較父類更獨(dú)特舆瘪,定義一個父類類型的引用指向一個子類的對象既可以使用子類強(qiáng)大的功能片效,又可以抽取父類的共性。所以英古,
父類引用只能調(diào)用父類中存在的方法和屬性淀衣,不能調(diào)用子類的擴(kuò)展部分;因為父類引用指向的是堆中子類對象繼承的父類召调;(但是如果強(qiáng)制把超類轉(zhuǎn)換成子類的話膨桥,就可以調(diào)用子類中新添加而超類沒有的方法了。)
同時唠叛,父類中的一個方法只有在父類中定義而在子類中沒有重寫的情況下只嚣,才可以被父類類型的引用調(diào)用;
對于父類中定義的方法玻墅,如果子類中重寫了該方法介牙,那么父類類型的引用將會調(diào)用子類中的這個方法壮虫,這就是動態(tài)連接澳厢。
二、類與對象的關(guān)系囚似?
對象:是具體的事物剩拢。
類:是對對象的抽象。
先有具體的對象饶唤,然后抽象各個對象之間象的部分徐伐,歸納出來類,通過類再認(rèn)識其他對象募狂。
對象是類的實例化办素。將對象的公有的功能和屬性抽象出來成為一類的具有普遍行為和屬性的類。
三祸穷、類的組成部分性穿?
成員變量、成員方法雷滚、構(gòu)造器需曾、代碼塊
四、重載與重寫的區(qū)別?
重載是方法名相同呆万,但形參不同(形參個數(shù)或者形參類型)商源,與方法的修飾符與返回值類型無關(guā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)鍵字。
不能和外部類有相同的名字盈蛮。
被編譯成一個完全獨(dú)立的.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)部類就像一個實例變量∥掖牛 它可以訪問它的外部類的所有成員變量和方法孽文,不管是靜態(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ù)進(jìn)行實例化纽绍,所以需要同時傳入父類的參數(shù)的值,這也就解釋了我為何要在子類的有參構(gòu)造器中寫入了父類構(gòu)造器的參數(shù)了势似。(當(dāng)然也可以不這么做拌夏,另外一種方式把父類有參數(shù)構(gòu)造器中的參數(shù)定義為static的變量,然后在super()中將其名稱寫入履因,也可以達(dá)到一樣的效果)
十障簿、static關(guān)鍵字?
十一栅迄、什么是值傳遞站故?什么是引用傳遞?
????????首先要說明的是java中是沒有指針的毅舆,java中只存在值傳遞西篓,只存在值傳遞!@时污淋! ?然而我們經(jīng)扯ヌ玻看到對于對象(數(shù)組余掖,類,接口)的傳遞似乎有點(diǎn)像引用傳遞礁鲁,可以改變對象中某個屬性的值盐欺。但是不要被這個假象所蒙蔽,實際上這個傳入函數(shù)的值是對象引用的拷貝仅醇,即傳遞的是引用的地址值冗美,所以還是按值傳遞。
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中引入了自動裝箱和拆箱機(jī)制:
(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ù)語法決定是否進(jìn)行裝箱和拆箱動作。
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ù)恰梢,這個不同點(diǎn)是因為如果你不自己寫構(gòu)造函數(shù)的情況下佛南,Java不會創(chuàng)建默認(rèn)的復(fù)制構(gòu)造函數(shù)。
不能被重寫嵌言,但是能被重載嗅回,因為構(gòu)造器不能被繼承。