java 语言与 C# 之比较
下面让我们考察 Java 语言和 C# 之间的区别。这两种语言具有许多相似之处,因此我们将重点关注其区别所在。
类型
Java 语言和 C# 都是单继承的面向对象语言,它们都具有一个作为其他所有类的基类的类:C# 中的 System.object 和 Java 语言中的 java.lang.Object 。这意味着对于您开发的类层次,两种语言是相似的。如果沿着层次树往上,您最终会到达对应的根类。
Java 语言使用了原始类型(primitive type)的概念,它们非常类似 C 和 C++ 中的对应概念。它们不是任何类层次的一部分,也不具有任何方法。此外,当使用它们作为参数时,它们总是按值传递。表 3 列出了 Java 语言中的原始类型和它们在 C# 中的等价类型:
表 3 Java 语言中的原始类型和它们在 C# 中的等价类型
Java 原始类型描述等价的 C# 类型描述
int32 位有符号整数int32 位有符号整数
long64 位有符号整数long32 位有符号整数
short16 位有符号整数short16 位有符号整数
char16 位无符号整数char16 位无符号整数
byte8 位无符号整数byte8 位无符号整数
boolean有效值是 true或者 falsebool有效值是 true或者 false
float32 位浮点数float32 位浮点数
double64 位浮点数double64 位浮点数
在 Java 语言中,每种原始类型具有一个对应的包装类,可以使用它将该类型作为对象而不是作为原始类型来处理。每个包装类具有一个构造函数,允许您根据原始类型中的数据创建该包装类型的一个实例。 在 C# 中,您可以隐式地将对应的类型转换为 object 的一个实例,因此不需要在这种情形下使用包装类。清单 12 中的代码突出了它们之间的区别。
清单 12. 原始类型和它们的包装类的例子
C# Java
public class Foo public class Foo
{ {
private void someMethod(object arg) { private void someMethod(Object arg) {
// do something with arg // do something with arg
} }
public static void Main(string[] args) { public static void main(String[] args) {
int i = 0; int i=0;
Foo x = new Foo(); Foo x = new Foo();
x.someMethod(i); x.someMethod(new Integer(i));
} }
} }
清单 12 中的 Java 原始类型被显式地包装在 Object 的一个派生类中,而在 C# 中,这种转换是隐式的。(C# 中隐式的转换称为 装箱(boxing)。)
注意在 Java 语言中,原始类型是按值传递的,对象类型在内部使用指针来表示,它们也是按值传递的。C# 中的默认行为是相同的,不过该语言还包括 ref 关键字来强制将值类型作为引用来传递。
表 4 显示了一些等价于 C# 类型但是没有映射到 Java 原始类型的 Java 语言类型。
表 4 C# 类型和它们的 Java 等价类型
等价的 Java 类型描述C# 类型描述
java.lang.Object任何非原始类型都是 Object 的派生类object每种类型都是 object 的派生类
java.lang.StringUnicode 字符stringUnicode 字符
java.math.BigDecimal可调整进位制的 32 位小数decimal可调整进位制的 32 位小数
¥29.00
¥299.00
¥399.00
¥498.00