这篇文章对C#与Java做一个语言级的对比,方便C#转Java或Java转C#的人有个大致了解。
这里大致用C#3.0与Java6.0做比较。
写完后得知维基百科里有更加全面得多的比较:
写完后得知维基百科里有更加全面得多的比较:
.NET(C#) | Java | |
---|---|---|
基本类型 | 基本类型 | |
C#中有无符号数,Java没有。 C#中有值类型,且可自己定义值类型的结构体(struct)。 Java中的基本类型(或叫基元类型)即为值类型, C#中的值类型(包括所有基本类型)间接继承自Object, C#中int等同于System.Int32,是值类型; Java中int是基本类型,是值类型, Java中的int与Integer的对应在C# 其他基本类型与之类似。 |
委托,事件 | [无] | |
C#中的委托可以认为是方法的类型化, Java通过接口来实现C#中委托和事件的功能, 另,C#中也有匿名类,但C# |
非托管 | [无] | |
C#可以有非托管代码,可以有指针等。Java没有。 |
索引器 | [无] | |
C#有索引器,可方便容器类实现类似数组的效果。Java没有, |
属性 | [无] | |
C#的属性通过在内部定义get/set方法, Java没有属性的概念。 |
预编译指令 | [无] | |
C#有预编译指令可方便调试, |
操作符重载 | [无] | |
C#可重载操作符。Java没有。 Java自己重载了String的+和+=,但没有重载==, |
内部类 | 内部类 | |
Java的内部类可以直接访问外部类的实例成员。 C#的不行。C#的内部类等同于Java的静态内部类。 |
goto、switch | [goto]、switch | |
C#允许用goto。Java的goto是保留关键字, C#的switch可以使用long、String; Java的switch中的case子句在后面没有跟break C# |
enum | enum | |
C#中的枚举是值类型,且其基于数值类型(默认基于int), Java中的枚举是引用类型(Java除了基本类型外, C#和Java的枚举都可以用于switch。 可以将C#的枚举作为数值看待而直接进行位运算, Java的枚举跟数值没有直接关系,因此不能直接这么用。 |
override | @Override | |
C#能被重写的方法必须添加virtual关键字声明为虚方法, Java默认方法都可被重写, |
定制特性 | 标注 | |
C#用中括号[]将定制特性括起来。Java用@打头, |
泛型 | 泛型 | |
Java中泛型实现使用的擦除机制, Java的泛型不支持值类型(使用的话会被自动包装成引用类型) |
C#的泛型在类型参数传入类型后会产生一个新类型( 对于Java的泛型,简单的讲,它的好处只在编译时, |
参数引用传递 | [无] | |
C#允许使用关键字out, Java只有值传递。 |
@字符串 | [无] | |
C#在写字符串时可以在引号前加个@符号来取消/的转义作用。 Java没有。 |
?? | [无] | |
C#的?? Java没有。 |
using | import | |
C#可以用using为命名空间或类指定别名。( Java的import可以引入类或包(即C#的命名空间), |
初始化 | 初始化 | |
C#调用基类构造函数的语法为: SubClass() : base() { } Java调用基类构造函数的语法为: SubClass(){ super(); } C#和Java都可以用类似的语法调用同一个类的其他构造函数。 Java有代码块概念,会在构造函数之前执行( 在成员变量声明时赋值, private int x = 1; private int y = x + 10; 这里变量y的赋值语句有变量x。 C#不允许这样做。 |
interface | interface | |
Java的接口内允许有内部类、静态字段等。 C#不允许。 |
readonly,const | final | |
C#的const是绝对的常量,必须在声明语句中同时赋值, C# Java中的final(在约束变量的时候) 但C#的readonly和const有个区别, 而Java的final则是:有时候可以有时候不可以---- final int x = 1; // 这个可以 final int y = new Random().nextInt(); // 这个不可以 那么可以理解为:编译时能得到明确值的时候, |
[无] | throws | |
Java在可能抛出异常时, C#没有采用这种强制处理机制。 |
功能相同但语法有差异的 | ||
namespace == package (Java的package对文件结构也有要求;C#没有) internal == [默认] (Java中不写访问修饰符即表示访问权限是package; lock == synchronized (Java中synchronized可以修饰方法,C# : == extends,implements base == super is == instanceof (C#有as,Java没有) typeof == .class [SerializableAttribute]定制特性 == Serializable接口 [NonSerializedAttribute]定制特性 == transient params == ... (可变数目参数) |
这个列表里,Java比C#更漂亮的地方基本上只有一处:枚举。
所以就从这次比较来讲,C#几乎完胜Java,而C#
当然,.NET和Java两大体系的比较,语言只是一个方面,还有平台、IDE、开源等其他很多方面,这里就不说了。
发表评论 取消回复