服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

华山论剑:c#对java


  一、c#、c++和java
  c#的语言规范由microsoft的anders hejlsberg与scott wiltamuth编写。在当前microsoft天花乱坠的宣传中,对c#和c++、java作一番比较总是很有趣的。考虑到当前it媒体的舆论倾向,如果你早就知道c#更接近java而不是c++,事情也不值得大惊小怪。对于刚刚加入这场讨论的读者,下面的表1让你自己作出判断。显然,结论应该是:java和c#虽然不是孪生子,但c#最主要的特色却更接近java而不是c++。
  
 华山论剑:c#对java(图一)


  了解表1总结的重要语言功能之后,请继续往下阅读,了解c#和java的一些重要区别。
  
  二、语言规范的比较
  2.1、简单数据类型
  
  简单数据类型(primitive)在c#中称为值类型,c#预定义的简单数据类型比java多。例如,c#有unit,即无符号整数。表2列出了所有c#的预定义数据类型:
  
华山论剑:c#对java(图二)

  2.2、常量
  
  忘掉java中的static final修饰符。在c#中,常量可以用const关键词声明。
  
   public const int x = 55;
  
  此外,c#的设计者还增加了readonly关键词。如果编译器编译时未能确定常量值,你可以使用readonly关键词。readonly域只能通过初始化器或类的构造函数设置。
  
  2.3、公用类的入口点
  
  在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方法返回1:
  
   using system;
  
  public class hello {
  
  public static int main() {
  
  console.writeline("done");
  
  return 1;
  
  }
  
  }
  
  与此相对,在java中重载main方法是不合法的。
  
  2.4、switch语句
  
  在java中,switch语句只能处理整数。但c#中的switch语句不同,它还能够处理字符变量。请考虑下面用switch语句处理字符串变量的c#代码:
  
   using system;
  
  public class hello {
  
  public static void main(string[] args) {
  
  switch (args[0]) {
  
  case "老板":
  
  console.writeline("早上好!我们随时准备为您效劳!");
  
  break;
  
  case "雇员":
  
  console.writeline("早上好!你可以开始工作了!");
  
  break;
  
  default:
  
  console.writeline("早上好!祝你好运!");
  
  break;
  
  }
  
  }
  
  }
  
  与java中的switch不同,c#的switch语句要求每一个case块或者在块的末尾提供一个break语句,或者用goto转到switch内的其他case标签。
  
  2.5、foreach语句
  
  foreach语句枚举集合中的各个元素,为集合中的每一个元素执行一次代码块。请参见下面的例子。
  
   using system;
  
  public class hello {
  
  public static void main(string[] args) {
  
  foreach (string arg in args)
  
  console.writeline(arg);
  
  }
  
  }
  
  如果在运行这个执行文件的时候指定了参数,比如“hello peter kevin richard”,则程序的输出将是下面几行文字:
  
   peter
  
  kevin
  
  richard
  
  2.6、c#没有>>>移位操作符
  
  c#支持uint和ulong之类的无符号变量类型。因此,在c#中,右移操作符(即“>>”)对于无符号变量类型和带符号变量类型(比如int和long)的处理方式不同。右移uint和ulong丢弃低位并把空出的高位设置为零;但对于int和long类型的变量,“>>”操作符丢弃低位,同时,只有当变量值是正数时,“>>”才把空出的高位设置成零;如果“>>”操作的是一个负数,空出的高位被设置成为1。
  
  java中不存在无符号的变量类型。因此,我们用“>>>”操作符在右移时引入负号位;否则,使用“>>”操作符。
  
  2.7、goto关键词
  
  java不用goto关键词。在c#中,goto允许你转到指定的标签。不过,c#以特别谨慎的态度对待goto,比如它不允许goto转入到语句块的内部。在java中,你可以用带标签的语句加上break或continue取代c#中的goto。
  
  2.8、声明数组
  
  在java中,数组的声明方法非常灵活,实际上有许多种声明方法都属于合法的方法。例如,下面的几行代码是等价的:
  
   int[] x = { 0, 1, 2, 3 };
  
  int x[] = { 0, 1, 2, 3 };
  
  但在c#中,只有第一行代码合法,[]不能放到变量名字之后。
  
  2.9、包
  
  在c#中,包(package)被称为名称空间。把名称空间引入c#程序的关键词是“using”。例如,“using system;”这个语句引入了system名称空间。
  
  然而,与java不同的是,c#允许为名称空间或者名称空间中的类指定别名:
  
   using theconsole = system.console;
  
  public class hello {
  
  public static void main() {
  
  theconsole.writeline("使用别名");
  
  }
  
  }
  
  虽然从概念上看,java的包类似于.net的名称空间。然而,两者的实现方式不同。在java中,包的名字同时也是实际存在的实体,它决定了放置.java文件的目录结构。在c#中,物理的包和逻辑的名称之间是完全分离的,也就是说,名称空间的名字不会对物理的打包方式产生任何影响。在c#中,每一个源代码文件可以从属于多个名称空间,而且它可以容纳多个公共类。
  
  .net中包的实体称为程序集(assembly)。每一个程序集包含一个manifest结构。manifest列举程序集所包含的文件,控制哪些类型和资源被显露到程序集之外,并把对这些类型和资源的引用映射到包含这些类型与资源的文件。程序集是自包含的,一个程序集可以放置到单一的文件之内,也可以分割成多个文件。.net的这种封装机制解决了dll文件所面临的问题,即臭名昭著的dll hell问题。
  
  2.10、默认包
  
  在java中,java.lang包是默认的包,它无需显式导入就已经自动包含。例如,要把一些文本输出到控制台,你可以使用下面的代码:
  
   system.out.println("hello world from java");
  
  c#中不存在默认的包。如果要向控制台输出文本,你使用system名称空间console对象的writeline方法。但是,你必须显式导入所有的类。代码如下:
  
   using system;
  
  public class hello {
  
  public static void main() {
  
  console.writeline("hello world from c#");
  
  }
  
  }
  
  2.11、面向对象
  
  java和c#都是完全面向对象的语言。在面向对象编程的三大原则方面,这两种语言接近得不能再接近。
  
  继承:这两种语言都支持类的单一继承,但类可以实现多个接口。所有类都从一个公共的基类继承。
  
  封装与可见性:无论是在java还是c#中,你都可以决定类成员是否可见。除了c#的internal访问修饰符之外,两者的可见性机制非常相似。
  
  多态性:java和c#都支持某些形式的多态性机制,且两者实现方法非常类似。
  
  2.12、可访问性
  
  类的每个成员都有特定类型的可访问性。c#中的访问修饰符与java中的基本对应,但多出了一个internal。简而言之,c#有5种类型的可访问性,如下所示:
  
  public:成员可以从任何代码访问。
  
  protected:成员只能从派生类访问。
  
  internal:成员只能从同一程序集的内部访问。
  
  protected internal:成员只能从同一程序集内的派生类访问。
  
  private:成员只能在当前类的内部访问。
  
  2.13、派生类
  
  在java中,我们用关键词“extends”实现继承。c#采用了c++的类派生语法。例如,下面的代码显示了如何派生父类control从而创建出新类button:
  public class button: control { . . }
  
  2.14、最终类
  
  由于c#中不存在final关键词,如果想要某个类不再被派生,你可以使用sealed关键词,如下例所示:
  
   sealed class finalclass { . . }
  
  2.15、接口
  
  
  接口这个概念在c#和java中非常相似。接口的关键词是interface,一个接口可以扩展一个或者多个其他接口。按照惯例,接口的名字以大写字母“i”开头。下面的代码是c#接口的一个例子,它与java中的接口完全一样:
  
   interface ishape { void draw(); }
  
  扩展接口的语法与扩展类的语法一样

扫描关注微信公众号