介绍
本文主要为C#开发人员了解Java提供一些基础。
Java中缺少C#的功能
- C#包含更多原始类型和捕获算术异常的功能。
- 包括大量的Java注释便利,其中许多,例如运算符重载和用户定义的强制转换,已经为C ++程序员社区所熟悉。
- 事件处理是“一流的公民”,它是语言本身的一部分。
- 允许定义“结构”,这些结构类似于类,但可以在堆栈上分配(与C#和Java中类的实例不同)。
- C#将属性作为语言语法的一部分来实现。
- C#允许switch语句对进行操作string。
- C#允许提供闭包功能的匿名方法。
- C#允许迭代器通过功能样式yield关键字使用协程。
- C#支持输出参数,帮助返回多个值,这是C ++和SQL共享的功能。
- C#具有别名空间的能力。
- C#具有“显式成员实现”,该类允许类从其自己的类方法中单独实现接口的方法。这也允许它实现两个不同的接口,碰巧具有相同名称的方法。接口的方法不必是public; 它们只能通过该界面进行访问。
- C#提供了与COM的集成。
- 按照C和C ++的示例,C#允许按引用调用原始类型和引用类型。
C#中缺少Java的功能
- Java的strictfp关键字保证浮点运算的结果在各个平台之间保持相同。
- Java支持检查异常,以更好地实施错误捕获和处理。
语言之间的哲学差异
- Java中没有无符号的原始数字类型。尽管普遍认为在代码中混合有符号和无符号变量是不好的,但是Java缺乏对无符号数字类型的支持,这使其在某种程度上不适合低级编程。
- C#不包括检查的异常。有人会认为检查异常对于良好的编程习惯非常有帮助。其他人,包括首席C#语言架构师Anders Hejlsberg,认为它们在某种程度上是Java的实验,而且还没有证明它们是值得的。
- C#的命名空间与C ++中的命名空间更为相似。与Java不同,名称空间不指定源文件的位置。(实际上,对于Java源文件位置来说,对应它的包目录结构并不是绝对必要的。)
- C#包括委托,而Java不包括。有人认为委托使方法调用模型复杂化,因为委托是通过反射来处理的,这通常很慢。另一方面,它们可以通过消除声明新的(可能是匿名的)类以挂接到事件的需要,从而简化代码。
- Java要求源文件名必须与其中的唯一public类匹配,而C#允许public同一文件中有多个类。
- C#允许使用指针,某些语言设计者认为这是不安全的,但是某些语言功能试图确保不会意外滥用此功能。指针还极大地使诸如Java的RMI(远程方法调用)之类的技术复杂化,在该技术中,可以在一台完全独立的计算机上运行的程序中引用驻留在一台计算机上的程序对象。一些人推测,Java中缺少内存指针(被对象引用的更抽象的概念所取代)是网格计算时代的头号功臣,网格应用程序可以将单个应用程序分布在许多物理硬件上。
- C#支持goto关键字。有时这可能很有用,但是通常建议使用结构化的控制流方法。
- C#具有真正的多维数组,相对Java可用的数组(C#称为锯齿状数组)。多维数组始终是矩形的(在2D情况下,或对于更大的维数类似),而数组可以存储各种长度的行(同样在2D情况下)。如果内存是一个瓶颈(只有一个内存引用而不是两个内存引用,则矩形阵列可能会加快访问速度);如果内存不完整但成本高昂,则锯齿状数组可以节省内存(每行一个指针的代价) 。矩形数组还消除了为每行显式分配内存的需要。
- Java不包括运算符重载,因为滥用运算符重载可能导致难以理解和调试的代码。C#允许操作符重载,如果谨慎使用,则可以使代码更简洁,更易读。Java缺乏重载使其在某种程度上不适合某些数学程序。相反,.NET的数字类型不与add / subtract / etc共享公共接口或超类方法,限制了数值库的灵活性。
- 默认情况下,C#中的方法是非虚拟的。但是,在Java中,默认情况下方法是虚拟的。虚方法保证将调用对象的最终重载方法,该方法由运行时确定。在调用或编写任何虚拟方法时,您始终必须牢记这一点!如果该方法声明为非虚拟方法,则调用的方法将由编译器确定。这是Java和.NET平台的设计者之间的主要哲学差异。
- Java 1.5的泛型使用类型擦除。当Java源代码编译为字节码时,有关泛型类型的信息将会丢失。.NET 2.0的泛型在编译后得以保留,因为从.NET公共语言运行时2.0版(简称CLR)开始,对泛型的支持。Java的方法允许Java 1.5二进制文件在1.4 JRE中运行,但要付出额外的运行时类型检查的代价。
- C#是由ECMA和ISO标准定义的,而Java是专有的,尽管在很大程度上是通过开放社区流程进行控制的。
- C#API完全由Microsoft控制,而Java API通过开放的社区流程进行管理。
- .NET运行时允许托管和非托管代码,从而实现Java的纯托管代码环境中不存在的某些类型的错误,但也可以与现有代码进行交互。
问题:java在默认中,所有方法都是虚方法,这意味着什么?
答:这意味着,java中的所有对象,基本上都有了动态代理的潜在可能