淺談Java和C#在面向?qū)ο笊险Z(yǔ)法的區(qū)別
做了幾年了開(kāi)發(fā)一直沒(méi)有總結(jié)什么,回到了家鄉(xiāng)的小城做了一名培訓(xùn)班的教員,教授軟件開(kāi)發(fā)的知識(shí)。細(xì)小的知識(shí)從頭細(xì)細(xì)嚼來(lái),別有一番滋味。或是以前遺漏的太多,或是確實(shí)沒(méi)有系統(tǒng)的學(xué)習(xí)過(guò),教學(xué)生的過(guò)程中自己也對(duì)教材有了一遍系統(tǒng)深入的學(xué)習(xí)。雖然教的和學(xué)的都很膚淺,但是為了幫助學(xué)生們理解,然后自己也會(huì)思考為什么會(huì)這樣?這種來(lái)自于最基礎(chǔ)的思考,一直向上反饋,發(fā)現(xiàn)這種思考原來(lái)可以令自己進(jìn)步的非常快。雖然目前還在思考入門(mén)階段的問(wèn)題,已經(jīng)受益良多了。那么如果把之前的開(kāi)發(fā)中的問(wèn)題都思考一遍,又能收獲多少能?寫(xiě)寫(xiě)博客吧,一直告訴學(xué)生們這是一個(gè)好的習(xí)慣,可自己卻從來(lái)沒(méi)有身體力行。那么,就從現(xiàn)在開(kāi)始......面向?qū)ο?/strong>
面向?qū)ο笫且环N開(kāi)發(fā)思想,最應(yīng)該記住的一句話是萬(wàn)物皆對(duì)象。為了讓程序更好的被理解和編寫(xiě),把現(xiàn)實(shí)生活中描述事物的方式和思路融合進(jìn)入,就成了面向?qū)ο蟮乃枷搿0焉钪械氖挛锶诤线M(jìn)程序中那么就需要描述,描述分為特征和行為兩方面,而不同類(lèi)別的對(duì)象特征和行為具有巨大的差異,為了更好的制定描述每一類(lèi)事物的方式,那么提取來(lái)一個(gè)編程世界中的類(lèi)的概念,等同于生活中的類(lèi)型的概念,每一種事物都應(yīng)該是有類(lèi)型的。然后生活中的事物按不同的方面進(jìn)行分類(lèi)的話,可以劃入不同的類(lèi)別,所有編程中的類(lèi)也是一個(gè)公說(shuō)公有理,婆說(shuō)婆有理的玩意,相當(dāng)?shù)某橄螅哂邢喈?dāng)?shù)牟淮_定性和隨意性。
類(lèi)的構(gòu)成:
Java中的類(lèi),包含屬性和方法。屬性即類(lèi)中的變量,可分靜態(tài)變量、實(shí)例變量(全局變量)、局部變量(存在于方法中,聲明周期僅限于該方法的調(diào)用階段)
C#中的類(lèi),包含字段、屬性和方法。字段對(duì)應(yīng)java中的屬性,C#中的屬性對(duì)象java中的get和set訪問(wèn)器,是對(duì)字段的封裝,方法一樣,都是描述行為。
類(lèi)成員的調(diào)用:
實(shí)例成員由對(duì)象調(diào)用。靜態(tài)成員由類(lèi)調(diào)用。但是在java中靜態(tài)成員也可以被實(shí)例調(diào)用,相當(dāng)于班上的每一個(gè)學(xué)生都可以任意的支配班費(fèi)了,很不好的一個(gè)問(wèn)題。C#在這方面嚴(yán)格限制了,靜態(tài)成員只能有類(lèi)進(jìn)行調(diào)用。
三大特性-封裝
封裝:為了隱藏內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),達(dá)到對(duì)數(shù)據(jù)安全性的保護(hù)和代碼重用的效果的一種手段。
封裝無(wú)處不在,看似簡(jiǎn)單卻可無(wú)限延伸。并沒(méi)有一個(gè)明確的關(guān)鍵字來(lái)表示封裝。既然是思想,是手段,所有在java中和c#中是沒(méi)有語(yǔ)法區(qū)別的。僅僅是他們?cè)诮柚L問(wèn)修飾符來(lái)達(dá)到封裝的效果時(shí),兩種語(yǔ)言的訪問(wèn)修飾符是不一樣的。
Java中:
private:私有的,僅內(nèi)部可以訪問(wèn)
dufault:默認(rèn)的,同一包的內(nèi)部可以訪問(wèn)。
protected:受保護(hù)的,同一包中或者是不同包的子類(lèi)中可以訪問(wèn)。
public:公共的,任何地方可以訪問(wèn)。
特點(diǎn):有明確的大小統(tǒng)屬關(guān)系:private < default < protected < public
C#中(引入程序集的概念。命名空間類(lèi)似于java中的包,但它是邏輯分組不同于java中的包是物理分組,程序集類(lèi)似于一個(gè)項(xiàng)目):
private:私有的,僅內(nèi)部可以訪問(wèn)。
intenal:內(nèi)部的,同一程序集的內(nèi)部可以訪問(wèn),同default。
protected:受保護(hù)的,子類(lèi)中可以訪問(wèn),和java中protected是不同的,此處范圍要小些,同程序集的非子類(lèi)不能訪問(wèn)。
proteted intenal:是intenal和protected訪問(wèn)范圍的并集。
public:公共的,任何地方可以訪問(wèn)。
特點(diǎn):沒(méi)有明確的大小統(tǒng)屬關(guān)系,intenal和protected的訪問(wèn)范圍大小是分不清的。
三大特性-繼承
繼承:目的是為了讓一個(gè)類(lèi)擁有另一個(gè)類(lèi)的屬性和方法。
Java中:使用extends表示使用繼承
重寫(xiě)的要求:a、方法名、返回值類(lèi)型、參數(shù)相同;b、訪問(wèn)修飾符訪問(wèn)范圍要大于或等于父類(lèi)方法訪問(wèn)修飾符;
訪問(wèn)父類(lèi)成員:使用super關(guān)鍵字,可使用super(參數(shù));在構(gòu)造方法中指定調(diào)用父類(lèi)一個(gè)構(gòu)造方法。
C#中:使用:表示使用繼承
重寫(xiě)的要求:a、方法名、返回值類(lèi)型、參數(shù)、訪問(wèn)修飾符相同;b、父類(lèi)方法被virtual修飾,子類(lèi)方法被override修飾
訪問(wèn)父類(lèi)成功:使用base關(guān)鍵字,在構(gòu)造方法后使用:base(參數(shù));指定調(diào)用父類(lèi)構(gòu)造方法,base不能使用在靜態(tài)環(huán)境中,不能調(diào)用父類(lèi)靜態(tài)成員。
覆蓋:使用new關(guān)鍵字。在c#中引入覆蓋的內(nèi)容,對(duì)父類(lèi)的非virtual方法,也就是不可重寫(xiě)的方法,使用覆蓋,可以覆蓋掉父類(lèi)的方法。對(duì)覆蓋我的看法是為了彌補(bǔ)必須被virtual修飾的方法才能重寫(xiě)這個(gè)限制可能帶來(lái)的問(wèn)題,但是能不用就不用,覆蓋意義不大,或者說(shuō)是我還沒(méi)有真切體會(huì)到覆蓋的實(shí)際作用和使用場(chǎng)合,有高人可以評(píng)論解惑。
判斷是否重寫(xiě)成功的依據(jù):使用父類(lèi)的引用指向子類(lèi)的對(duì)象,如果該方法調(diào)用的是父類(lèi)方法說(shuō)明重寫(xiě)不成功,如果調(diào)用到子類(lèi)方法,說(shuō)明重寫(xiě)成功。
三大特性-多態(tài)
多態(tài):同一種行為的多種存在形態(tài)。表現(xiàn)形式有:重載、重寫(xiě)。
重載要求:a、同一類(lèi)中;b、方法名相同;c、參數(shù)不同(參數(shù)個(gè)數(shù)、類(lèi)型、順序)。
調(diào)用時(shí)根據(jù)傳入的參數(shù)來(lái)決定調(diào)用到哪一方法。
抽象類(lèi)和接口
抽象類(lèi):使用abstract修飾的類(lèi)稱(chēng)為抽象類(lèi)。
來(lái)源:在我看來(lái),抽象類(lèi)的來(lái)源是值得仔細(xì)琢磨一下,有利于加深理解。現(xiàn)實(shí)生活中存在很多這樣的問(wèn)題,也就是我們知道這一類(lèi)事物都會(huì)做這個(gè)動(dòng)作(方法),但是并不知道它如何去做,比如我們都知道動(dòng)物為動(dòng),但是每個(gè)動(dòng)物你不知道它如何去動(dòng)。這個(gè)時(shí)候定義這個(gè)Animal類(lèi)時(shí),就需要一個(gè)move方法,只有方法頭(描述會(huì)做什么事情),沒(méi)有方法體(描述如何去做這件事情),那么這個(gè)方法比較特殊,我們就標(biāo)記為抽象方法,使用abstract修飾。
那么Animal類(lèi)中有了抽象方法,假如你實(shí)例化了Animal類(lèi),當(dāng)你調(diào)用move方法時(shí),會(huì)出現(xiàn)什么樣的問(wèn)題呢?未知,因?yàn)樗](méi)有描述如何去做。所以為了避免出現(xiàn)這種未知的情況,比如把Animal類(lèi)定義為抽象類(lèi),顯著特點(diǎn)就是不能實(shí)例化。一個(gè)不能實(shí)例化的類(lèi),他的非靜態(tài)成員是不可被調(diào)用的,那么這樣的類(lèi)存在的意義在于什么呢?
所以總結(jié):抽象類(lèi)存在的意義在于被繼承。抽象類(lèi)是為了抽象方法而存在的,有構(gòu)造方法卻不能被實(shí)例化。語(yǔ)法上java和c#在這方面是一樣的,不再細(xì)說(shuō)。
接口:制定的一組規(guī)則和規(guī)范,讓實(shí)現(xiàn)類(lèi)都滿足這個(gè)規(guī)則和規(guī)范,在實(shí)際應(yīng)用中能很大程序增加程序的靈活性。面向接口編程,我的理解也不是特別深,也不是我一兩句可以講清楚。有高人可以在后面貼貼自己的心得,學(xué)習(xí)學(xué)習(xí)。
區(qū)別:C#中,實(shí)現(xiàn)類(lèi)如果沒(méi)有實(shí)現(xiàn)接口中所有的方法,則比如把自己定義為抽象類(lèi)并且把未實(shí)現(xiàn)的方法重新抄寫(xiě)一遍定義為抽象方法。
總結(jié)
一直以來(lái)是做java開(kāi)發(fā)的,教學(xué)的需要才學(xué)習(xí)c#,有相通之處,學(xué)起來(lái)很快。這里僅僅關(guān)注語(yǔ)法,對(duì)于大牛們都在搞協(xié)議,搞底層,是看不上這個(gè)的。
僅以此文拋磚引玉,該噴噴,該砸砸,別人身攻擊就好了。
posted on 2013-06-08 15:14 順其自然EVO 閱讀(164) 評(píng)論(0) 編輯 收藏