熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

華山論劍:C#對Java

2013-11-23 17:57:07  來源: Javascript 

  C#C++和Java
  C#的語言規范由Microsoft的Anders Hejlsberg與Scott Wiltamuth編寫在當前Microsoft天花亂墜的宣傳中對C#和C++Java作一番比較總是很有趣的考慮到當前IT媒體的輿論傾向如果你早就知道C#更接近Java而不是C++事情也不值得大驚小怪對於剛剛加入這場討論的讀者下面的表讓你自己作出判斷顯然結論應該是Java和C#雖然不是孿生子但C#最主要的特色卻更接近Java而不是C++
  
 

  了解表總結的重要語言功能之後請繼續往下閱讀了解C#和Java的一些重要區別
  
  語言規范的比較
  簡單數據類型
  
  簡單數據類型(Primitive)在C#中稱為值類型C#預定義的簡單數據類型比Java多例如C#有unit即無符號整數列出了所有C#的預定義數據類型
  

  常量
  
  忘掉Java中的static final修飾符在C#中常量可以用const關鍵詞聲明
  
   public const int x = ;
  
  此外C#的設計者還增加了readonly關鍵詞如果編譯器編譯時未能確定常量值你可以使用readonly關鍵詞readonly域只能通過初始化器或類的構造函數設置
  
  公用類的入口點
  
  在Java中公用類的入口點是一個名為main的公用靜態方法main方法的參數是String對象數組它沒有返回值在C#中main方法變成了公用靜態方法Main(大寫的M)Main方法的參數也是一個String對象數組而且也沒有返回值如下面的原型聲明所示
  
   public static void Main(String[] args)
  
  但是C#的Main方法不局限於此如果不向Main方法傳遞任何參數你可以使用上述Main方法的一個重載版本即不帶參數列表的版本也就是說下面的Main方法也是一個合法的入口點
  
   public static void Main()
  
  另外如果你認為有必要的話Main方法還可以返回一個int例如下面代碼中的Main方法返回
  
   using System;
  
  public class Hello {
  
  public static int Main() {
  
  ConsoleWriteLine(Done);
  
  return ;
  
  }
  
  }
  
  與此相對在Java中重載main方法是不合法的
  
  switch語句
  
  在Java中switch語句只能處理整數但C#中的switch語句不同它還能夠處理字符變量請考慮下面用switch語句處理字符串變量的C#代碼
  
   using System;
  
  public class Hello {
  
  public static void Main(String[] args) {
  
  switch (args[]) {
  
  case 老板:
  
  ConsoleWriteLine(早上好!我們隨時准備為您效勞!);
  
  break;
  
  case 雇員:
  
  ConsoleWriteLine(早上好!你可以開始工作了!);
  
  break;
  
  default:
  
  ConsoleWriteLine(早上好!祝你好運!);
  
  break;
  
  }
  
  }
  
  }
  
  與Java中的switch不同C#的switch語句要求每一個case塊或者在塊的末尾提供一個break語句或者用goto轉到switch內的其他case標簽
  
  foreach語句
  
  foreach語句枚舉集合中的各個元素為集合中的每一個元素執行一次代碼塊請參見下面的例子
  
   using System;
  
  public class Hello {
  
  public static void Main(String[] args) {
  
  foreach (String arg in args)
  
  ConsoleWriteLine(arg);
  
  }
  
  }
  
  如果在運行這個執行文件的時候指定了參數比如Hello Peter Kevin Richard則程序的輸出將是下面幾行文字
  
   Peter
  
  Kevin
  
  Richard
  
  C#沒有>>>移位操作符
  
  C#支持uint和ulong之類的無符號變量類型因此在C#中右移操作符(即>>)對於無符號變量類型和帶符號變量類型(比如int和long)的處理方式不同右移uint和ulong丟棄低位並把空出的高位設置為零但對於int和long類型的變量>>操作符丟棄低位同時只有當變量值是正數時>>才把空出的高位設置成零如果>>操作的是一個負數空出的高位被設置成為
  
  Java中不存在無符號的變量類型因此我們用>>>操作符在右移時引入負號位否則使用>>操作符
  
  goto關鍵詞
  
  Java不用goto關鍵詞在C#中goto允許你轉到指定的標簽不過C#以特別謹慎的態度對待goto比如它不允許goto轉入到語句塊的內部在Java中你可以用帶標簽的語句加上break或continue取代C#中的goto
  
  聲明數組
  
  在Java中數組的聲明方法非常靈活實際上有許多種聲明方法都屬於合法的方法例如下面的幾行代碼是等價的
  
   int[] x = { };
  
  int x[] = { };
  
  但在C#中只有第一行代碼合法[]不能放到變量名字之後
  
  
  
  在C#中包(Package)被稱為名稱空間把名稱空間引入C#程序的關鍵詞是using例如using System;這個語句引入了System名稱空間
  
  然而與Java不同的是C#允許為名稱空間或者名稱空間中的類指定別名
  
   using TheConsole = SystemConsole;
  
  public class Hello {
  
  public static void Main() {
  
  TheConsoleWriteLine(使用別名);
  
  }
  
  }
  
  雖然從概念上看Java的包類似於NET的名稱空間然而兩者的實現方式不同在Java中包的名字同時也是實際存在的實體它決定了放置java文件的目錄結構在C#中物理的包和邏輯的名稱之間是完全分離的也就是說名稱空間的名字不會對物理的打包方式產生任何影響在C#中每一個源代碼文件可以從屬於多個名稱空間而且它可以容納多個公共類
  
  NET中包的實體稱為程序集(Assembly)每一個程序集包含一個manifest結構manifest列舉程序集所包含的文件控制哪些類型和資源被顯露到程序集之外並把對這些類型和資源的引用映射到包含這些類型與資源的文件程序集是自包含的一個程序集可以放置到單一的文件之內也可以分割成多個文件NET的這種封裝機制解決了DLL文件所面臨的問題即臭名昭著的DLL Hell問題
  
  默認包
  
  在Java中javalang包是默認的包它無需顯式導入就已經自動包含例如要把一些文本輸出到控制台你可以使用下面的代碼
  
   Systemoutprintln(Hello world from Java);
  
  C#中不存在默認的包如果要向控制台輸出文本你使用System名稱空間Console對象的WriteLine方法但是你必須顯式導入所有的類代碼如下
  
   using System;
  
  public class Hello {
  
  public static void Main() {
  
  ConsoleWriteLine(Hello world from C#);
  
  }
  
  }
  
  面向對象
  
  Java和C#都是完全面向對象的語言在面向對象編程的三大原則方面這兩種語言接近得不能再接近
  
  繼承這兩種語言都支持類的單一繼承但類可以實現多個接口所有類都從一個公共的基類繼承
  
  封裝與可見性無論是在Java還是C#中你都可以決定類成員是否可見除了C#的internal訪問修飾符之外兩者的可見性機制非常相似
  
  多態性Java和C#都支持某些形式的多態性機制且兩者實現方法非常類似
  
  可訪問性
  
  類的每個成員都有特定類型的可訪問性C#中的訪問修飾符與Java中的基本對應但多出了一個internal簡而言之C#有種類型的可訪問性如下所示
  
  public成員可以從任何代碼訪問
  
  protected成員只能從派生類訪問
  
  internal成員只能從同一程序集的內部訪問
  
  protected internal成員只能從同一程序集內的派生類訪問
  
  private成員只能在當前類的內部訪問
  
  派生類
  
  在Java中我們用關鍵詞extends實現繼承C#采用了C++的類派生語法例如下面的代碼顯示了如何派生父類Control從而創建出新類Button
  public class Button: Control { }
  
  最終類
  
  由於C#中不存在final關鍵詞如果想要某個類不再被派生你可以使用sealed關鍵詞如下例所示
  
   sealed class FinalClass { }
  
  接口
  
  
  接口這個概念在C#和Java中非常相似接口的關鍵詞是interface一個接口可以擴展一個或者多個其他接口按照慣例接口的名字以大寫字母I開頭下面的代碼是C#接口的一個例子它與Java中的接口完全一樣
  
   interface IShape { void Draw(); }
  
  擴展接口的語法與擴展類的語法一樣
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25420.html
    相關文章
      没有相关文章
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.