首頁  >  文章  >  後端開發  >  比較C#和JAVA中物件導向語法的區別

比較C#和JAVA中物件導向語法的區別

巴扎黑
巴扎黑原創
2017-09-06 14:01:342131瀏覽

物件導向是一種開發思想,最應該記住的一句話是萬物皆物件。為了讓程式更好的被理解和編寫,把現實生活中描述事物的方式和想法融合進入,就成了物件導向的想法。把生活中的事物融合進程序中那麼就需要描述,描述分為特徵和行為兩方面,而不同類別的對象特徵和行為具有巨大的差異,為了更好的製定描述每一類事物的方式,那麼提取來一個程式設計世界中的類別的概念,等同於生活中的類型的概念,每一種事物都應該是有類型的。然後生活中的事物按不同的方面進行分類的話,可以劃入不同的類別,所有編程中的類也是一個公說公有理,婆說婆有理的玩意,相當的抽象,具有相當的不確定性和隨意性。

  類別的構成:

  Java中的類,包含屬性和方法。屬性即類別中的變量,可分靜態變數、實例變數(全域變數)、局部變數(存在於方法中,宣告週期僅限於該方法的呼叫階段)

  C#中的類,包含字段、屬性和方法。欄位對應java中的屬性,C#中的屬性物件java中的get和set存取器,是對欄位的封裝,方法一樣,都是描述行為。

  類別成員的呼叫:

  實例成員由物件呼叫。靜態成員由類別呼叫。但是在java中靜態成員也可以被實例調用,相當於班上的每個學生都可以任意的支配班費了,很不好的一個問題。 C#在這方面嚴格限制了,靜態成員只能有類別進行呼叫。

  三大特性-封裝

  封裝:為了隱藏內部的實作細節,達到對資料安全性的保護和程式碼重用的效果的一種手段。

  封裝無所不在,看似簡單卻可無限延伸。並沒有一個明確的關鍵字來表示封裝。既然是思想,是手段,所有在java中和c#中是沒有語法區別的。只是當他們藉助存取修飾符來達到封裝的效果時,兩種語言的存取修飾符是不一樣的。

  Java中:

  private:私有的,僅內部可以存取

  dufault:預設的,同一包的內部可以存取。

  protected:受保護的,同一套件中或是不同套件的子類別中可以存取。

  public:公共的,任何地方可以訪問。

  特徵:有明確的大小統屬關係:private < default < protected < public

  C#中(引入組件的概念。命名空間類似於java中的包,但它是邏輯分組不同於java中的套件是物理分組,組件類似於一個項目):

  private:私有的,僅內部可以存取。

  intenal:內部的,同一組件的內部可以訪問,同default。

  protected:受保護的,子類別中可以訪問,和java中protected是不同的,此處範圍要小些,同程序集的非子類別不能訪問。

  proteted intenal:是intenal和protected存取範圍的並集。

  public:公共的,任何地方可以訪問。

  特點:沒有明確的大小統屬關係,intenal和protected的存取範圍大小是分不清的。



三大特性-繼承   
繼承:目的是為了讓一個類別擁有另一個類別的屬性和方法。

  Java中:使用extends表示使用繼承

  重寫的要求:a、方法名稱、傳回值類型、參數相同;b、存取修飾符存取範圍大於或等於父類方法存取修飾符;

  存取父類別成員:使用super關鍵字,可使用super(參數);在建構方法中指定呼叫父類別一個建構方法。

  C#中:使用:表示使用繼承

  重寫的要求:a、方法名稱、傳回值類型、參數、存取修飾符相同;b、父類別方法被virtual修飾,子類別方法被override修飾

  存取父類別成功:使用base關鍵字,在建構方法後使用:base(參數);指定呼叫父類別建構方法,base不能使用在靜態環境中,不能呼叫父類別靜態成員。

  覆寫:使用new關鍵字。在c#中引入覆蓋的內容,對父類別的非virtual方法,也就是不可重寫的方法,使用覆蓋,可以覆寫父類別的方法。對覆蓋我的看法是為了彌補必須被virtual修飾的方法才能重寫這個限制可能帶來的問題,但是能不用就不用,覆蓋意義不大,或者說是我還沒有真切體會到覆蓋的實際作用和使用場合,有高人可以評論解惑。

  判斷是否重寫成功的依據:使用父類別的參考指向子類別的對象,如果該方法呼叫的是父類別方法說明重寫不成功,如果呼叫到子類別方法,說明重寫成功。

  三大特性-多型

#  多態:同一種行為的多種存在形態。表現形式有:重載、重寫。

  重載需求:a、同一類別中;b、方法名稱相同;c、參數不同(參數個數、型別、順序)。

  呼叫時根據傳入的參數來決定呼叫到哪一方法。

  抽象類別和介面

  抽象類別:使用abstract修飾的類別稱為抽象類別。

  來源:在我看來,抽象類別的來源是值得仔細琢磨一下,有利於加深理解。現實生活中存在著很多這樣的問題,也就是我們知道這一類事物都會做這個動作(方法),但是並不知道它如何去做,比如我們都知道動物為動,但是每個動物你不知道它如何去動。當這個時候定義這個Animal類別時,就需要一個move方法,只有方法頭(描述會做什麼事情),沒有方法體(描述如何去做這件事情),那麼這個方法比較特殊,我們就標記為抽象方法,使用abstract修飾。

  那麼Animal類別中有了抽象方法,假如你實例化了Animal類,當你呼叫move方法時,會出現什麼樣的問題呢?未知,因為它並沒有描述如何做。所以為了避免這種未知的情況,例如把Animal類定義為抽象類,顯著特徵就是不能實例化。一個不能實例化的類,他的非靜態成員是不可被呼叫的,那麼這樣的類別存在的意義在於什麼呢?

  所以總結:抽象類別存在的意義在於被繼承。抽象類別是為了抽象方法而存在的,有建構方法卻不能被實例化。文法上java和c#在這方面是一樣的,不再細說。

  介面:制定的一組規則和規範,讓實作類別都符合這個規則和規範,在實際應用中能很大程式增加程式的彈性。面向介面編程,我的理解也不是特別深,也不是我一兩句可以講清楚。有高人可以在後面貼貼自己的心得,學習學習。

  區別:C#中,實作類別如果沒有實作介面中所有的方法,則例如把自己定義為抽象類別並且把未實作的方法重新抄寫一遍定義為抽象方法。

  總結

  一直以來是做java開發的,教學的需要才學習c#,有相通之處,學起來很快。這裡僅僅關注文法,對於大牛們都在搞協議,搞底層,是看不上這個的。

以上是比較C#和JAVA中物件導向語法的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn