欢乐谷去西站:C#与JAVA的比较

来源:百度文库 编辑:中财网 时间:2024/04/28 19:47:58
                                                           ASP.NET基础教程:C#与JAVA的比较                 简单地说,它们不是一种语言,语法有差别,编程时具体用到的类库或者函数库也不一样。

  虽然它们不是一种语言,不过它们却也有所联系。广泛地说,C可以看作其他三种语言的源语言,因为其他三种语言几乎都是从C而来的,无论从数据类型还是控制语句看,其他三种语言都有从C得来的迹象。

  其中C++则一般看作是对C语言的扩展。因为C语言没有面向对象的语法结构,而当时业界又迫切需要面向对象的编程特性,所以贝尔实验室的开发者就为C添加了面向对象的结构。现在C++已经不只是C的扩展了,它已经完全可以被看作一种新的编程语言。虽然C的特性以及库函数仍然被C++支持,不过C++拥有自己的独立的类库体系,功能相当强大。

  Java语言是一种完全的面向对象语言,虽然它的底层(运行时库)是用C语言开发的,可是并不依赖于C。因为Java的运行是在运行时库的支持下进行的,所以运行效率比起可以更接近底层的C/C++来说效率会有所影响,不过Java的类库采用很好的设计理念设计,非常好用,也非常实用,已经成为业界的一种标准开发语言。它的跨平台的特性尤其让很多开发者欢迎,你只需要开发一次就能在所有安装了Java运行时库的系统上运行。Java发展了十几年了,可以应用领域非常之广泛,Web开发有JSP,J2EE,桌面领域现在有JavaFX。

  C#是微软开发的一种编程语言,语法类似Java,几乎就是从Java的翻版。运行原理和Java也类似,也是通过运行时库的支持运行。不过支持的平台还很有限。JAVA几乎被所有平台支持,而C#目前只被Windows和Linux支持,Windows下的支持当然是由微软自己开发的,而Linux下的支持则有MONO支持。实际上,MONO也是把C#应用转化为JAVA应用而已,所以本质上,C#仍然只是被微软自己的操作系统支持。应用平台受到限制,是它最大的缺点。

  C/C++的优点在于与底层比较接近,可以控制的粒度更加精细,是开发系统级应用的最佳选择。关于缺点,我想正是源于其优点,因为它们能控制的编程元素粒度精细,所以编程比较困难,烦琐,容易出错。

  Java和C#都比较高级,可以看作高级语言的高级语言,优点是开发容易,但运行效率不如更为底层的C/C++。

  具体选择使用的时候,可以根据实际的项目需要选择。运行效率要求高的,底层控制要求高的用C/C++,否则可以选择Java或C#;跨平台的要求高的可以用Java。

  关于跨平台,C/C++也是很好的语言,因为所有平台都支持,不同的是,不同平台支持的实现不同,类库不同,要编写跨平台的程序,需要选择跨平台的类库,如标准类库,如果标准类库的支持不够也只需要附加编写一个跨平台的支持类库。

  几种语言内容都很多,在这里就不详细列举了,要学好每一种都需要花费相当大的精力,祝你能有所成就!          C#与JAVA的相同之处:由于C#与JAVA都是基于C++发展起来的,因此二者之间具有很多相似之处,具体如下:

  1、C#和JAVA语言的编译结果是独立于计算机和编程语言的,可执行文件可以在受管理的执行

  环境中执行;

  2、C#和JAVA语言都是采用了自动的垃圾回收机制;

  3、C#和JAVA语言都取消了指针操作;

  4、C#和JAVA语言都没有头文件;

  5、C#和JAVA语言都只支持单重继承,要实现与多重继承类似的功能,必须通过接口来实现;

  6、类都是从Object类派生而来,类的对象通过关键字new生成;

  7、C#和JAVA语言都支持线程;

  8、C#和JAVA语言都没有全局变量和全局函数,所有的变量和函数都属于某个类所有;

  9、C#和JAVA语言都支持对数组和字符串边界的严格检查,不会出现边界溢出的情况;

  10、C#和JAVA语言都使用“.”操作符,不再使用“->”和“::”操作符;

  11、C#和JAVA语言都将null和bool作为关键字;

  12、C#和JAVA语言中所有的值都必须先初始化后才能使用;

  13、C#和JAVA语言中的if语句都不允许采用整数作为判断条件;

  14、C#和JAVA语言中的try语句块都可以后接finally语句块。

  C#与JAVA的不同之处:

  尽管C#和JAVA有很多相同之处,但是由于二者是两家不同公司开发的高级程序设计语言,它们又相互独立,

  自成体系,各自具有一些自己特有的特点,下面将C#与JAVA之间的不同之处如下:

  1、属性

  对于那些经常使用快速开发工具,如Delphi或者Visual Basic的开发人员来说,属性是一个非常熟悉的概念。

  一般来说,通过getXXX可以读取属性的值,而通过setXXX可以设置属性的值。

  JAVA中比较常见的属性操作语句: foo.setSize(foo.getSize()+1); label.getFont().setBold(true);

  c#中比较常见的属性操作语句: foo.size++; label.font.bold=true;

  很明显,上述的属性设置方式较JAVA来说更为简洁,可主读性也更强。这充分体现了C#简单的特点。

  JAVA对于属性的定义:public int getSize(){ return size; } public void setSize(int value){ size=value; }

  c#对于属性的定义进行了简化:public int Size{ get{ return size; } set{size=value; }}

  2、index

  C#提供index来给对象加上索引的功能,从而用与处理数组类似的方式来处理对象,JAVA语言则不支持index

  C#中定义index的典型方式如下:

  public Story this[int index]

  {

  get{return stories[index]; }

  set{

  if(value!=null){

  stories[index]=value

  }

  }

  3、delegate :可以认为是一种类型安全、面向对象的函数指针。

  C#使有delegate可以通过一个名字访问不同的函数,它实现和JAVA中的interface类似的功能,但是它比interface更为好用。

  4、event

  C#提供对event的直接支持,它通过delegate和event关键字实现对事件的处理。event关键字隐藏所有delegate方法,运算符“+=”和“-+”允许程序员自由加入或者删除时间处理程序。

  5、enum:枚举用于指定一系列的对象。

  C#通过如下语句来定义和使用枚举:

  定义:public enum Direction{North,East,West,South};

  使用:Direction wall=Direction.North;

  JAVA不直接支持枚举,如果要实现和C#相类似的功能,必须先定义一个类

  public class Direction{

  public final static int NORTH=1;

  public final static int EAST=2;

  public final static int WEST=3;

  public final static int SOUTH=4; }

  在定义了Direction类后,JAVA可以通过引用类中的值来使用枚举:

  int wall= Direction.NOTRH;

  6、foreach语句

  C#提供了标准的for循环,同时还提供了foreach语句(从VB中引入)来循环处理集合中的元素。

  JAVA遍历集合中的所有元素的典型处理方式如下:

  while(!collection.isEmpty())

  {

  Object o=collection.get();

  connection.next();

  …

  }

  C#遍历集合中的所有元素:foreach(object o in collection){…}

  7、统一数据类型:

  大多数的高级程序设计语言都有基本数据类型,如整型、浮点类型等。同时,为了更好地满足实际的需要,对不同的数据类型有不同的处理方式,显然,如果能够对简单数据类型的处理和对复杂数据类型的处理结合在一起,并用一致的方式加以处理的话,无疑会大大提升应用程序设计的效率,增强程序设计的灵活性。

  JAVA语言在处理基本数据类型的时候也采取分别处理的策略,但是在基本数据类型的基础上提供了一系列封装这些基本数据类型的类,例如:整型(int)被类Integer所封装,双精度浮点(double)被类Double封装。

  C#提供了一种和JAVA不同的方式来实现数据类型的统一。事实上,在c#中,即使是int这样的简单数据类型在C#内部也是通过一个结构体Int32来实现的,在C#中,可以这样认为,int只是结构体Int32的一个别名。由于C#中的结构体也继承自类Object,这样,Object类中定义的方法,各个结构体也拥有,于是,在C#中可以通过如下的方式来操作整数:int I=5; System.Console.WriteLine(i.ToString());

  8、操作符重载

  通过操作符重载可以用一种比较自然的方式来操纵各种数据类型,从而大大提升程序的可读性和灵活性。C#中的“==”操作符在Object类中进行了定义,在Object中定义的==操作符通过比较两个值的引用来获得最后的结果。如果使有和集合相关的类,则必须在这样的类中实现ICompar接口,这个接口中定义了一个方法CompareTo,该方法返回两个对象的比较结果,在此基础上,可以进一步定义各个实现比较的操作符,如

  “>”、“<”、“>=”、“<=”等。事实上,数字类型(int、long等)可以直接使用这些比较操作符,它们的内部都实现了ICompare接口。

  9、多态性

  虚似方法提供了多态性的技持。多态意味着派生类可以定义一个和基类中同名的方法。尽管JAVA和C#都支持多态性,但是它们的具体实现方式还是有一定的差别。

  在JAVA语言中,默认情况下,基类的对象可以直接调用派生类中的虚似方法,在C#语言中,基类要调用派生类中的虚似方法必须通过virtual关键字来实现。同时,在C#语言中,一个方法要重载基类中的同名方法,还必须通过关键字override来实现。在C#中实现多态的典型程序如下:

  Class B{ public virtual void foo{}}

  Class D:B{ public overried void foo(){}}

  以上只是简单地比较了C#和JAVA之间的异同,事实上,这二者之间的比较远不止上面所介绍的内容,要学好这两种语言,需要经过大量的实践工作,在实践中区分开两种语言的共同点和不同点。现在的面向对象的语言大多数都源自C++,java去掉了C++中那些复杂,实用性低的语言特性,达到了一个不错的平衡。

C#是在java如日中天的时候产生了,因此它不可避免的引入了java中绝大多数优秀的元素。

因此但从语言特性上,两种语言不会出现一种能实现,而一种无法实现的。

即便大型的应用,也是都可以实现,只不过可能在特定的方面,一种要比另一种做的好。

就算是所谓的跨平台。假如微软能推出linux版本的CLR和.net framework。c#一样可以跨,因为它和java都是拥有底层托管机制的。

非要说语言差别,下面基本应该全了,不过这些在另一种中都有替代实现方法。
1.属性:
java中定义和访问均要用get和set方法,可以不成对出现。
c#中是真正的属性,定义时get和set必须同时出现,房问时用.号即可。不用get,set

2.对象索引
就是对象数组
public Story this [int index] {

3.C#中,不用任何范围修饰符时,默认的是protect,因而不能在类外被访问.

4.因为JAVA规定,在一个文件中只能有一个public类,而且这个类的名称必须与文件名一模一样,这是一个区别

5.在C#中,它是以Main方法来定位入口的.如果一个程序中没有一个名为Main的方法,就会出"找不到入口的错误".不要把Main写成main哟

6.C#预定义的简单数据类型比Java多。例如,C#有unit,即无符号整数

7.忘掉Java中的static final修饰符。在C#中,常量可以用const关键词声明
C#的设计者还增加了readonly关键词,readonly域只能通过初始化器或类的构造函数设置
8.公用类的入口点:c#是可以对Main进行重载(java中是main),允许有int返回值和空参数的Main

9.在Java中,switch语句只能处理整数。但C#中的switch语句不同,它还能够处理字符变量。请考虑下面用switch语句处理字符串变量的C#代码

10.C#没有>>>移位操作符

11.goto关键词:
Java不用goto关键词。在C#中,goto允许你转到指定的标签。不过,C#以特别谨慎的态度对待goto,比如它不允许goto转入到语句块的内部。在Java中,你可以用带标签的语句加上break或continue取代C#中的goto。

12.int[] x = { 0, 1, 2, 3 };
int x[] = { 0, 1, 2, 3 };
但在C#中,只有第一行代码合法,[]不能放到变量名字之后。

13.与Java不同的是,C#允许为名称空间或者名称空间中的类指定别名:
using TheConsole = System.Console;

14.在Java中,包的名字同时也是实际存在的实体,它决定了放置.java文件的目录结构。在C#中,物理的包和逻辑的名称之间是完全分离的
.NET中包的实体称为程序集(Assembly)。每一个程序集包含一个manifest结构。manifest列举程序集所包含的文件,控制哪些类型和资源被显露到程序集之外,并把对这些类型和资源的引用映射到包含这些类型与资源的文件。程序集是自包含的,一个程序集可以放置到单一的文件之内,也可以分割成多个文件。.NET的这种封装机制解决了DLL文件所面临的问题,即臭名昭著的DLL Hell问题。

15.在Java中,java.lang包是默认的包,C#中不存在默认的包

16.C#中的访问修饰符与Java中的基本对应,但多出了一个internal。简而言之,C#有5种类型的可访问性,如下所示:

public:成员可以从任何代码访问。
protected:成员只能从派生类访问。
internal:成员只能从同一程序集的内部访问。
protected internal:成员只能从同一程序集内的派生类访问。
private:成员只能在当前类的内部访问。

17.由于C#中不存在final关键词,如果想要某个类不再被派生,你可以使用sealed关键词

18.与Java不同,C#中的接口不能包含域(Field)。
另外还要注意,在C#中,接口内的所有方法默认都是公用方法。在Java中,方法声明可以带有public修饰符(即使这并非必要),但在C#中,显式为接口的方法指定public修饰符是非法的。例如,下面的C#接口将产生一个编译错误。

19.C#中的is操作符与Java中的instanceof操作符一样,两者都可以用来测试某个对象的实例是否属于特定的类型。在Java中没有与C#中的as操作符等价的操作符。as操作符与is操作符非常相似,但它更富有“进取心”:如果类型正确的话,as操作符会尝试把被测试的对象引用转换成目标类型;否则,它把变量引用设置成null。

20.C#仍旧保留了C++的内存手工管理方法,它适合在速度极端重要的场合使用,而在Java中这是不允许的

21.在C#中,所有的异常都从一个名为Exception的类派生

22.枚举器即enum类型(java无),把它作为一个变量值的类型使用,从而把变量可能的取值范围限制为枚举器中出现的值。

23.结构(Struct)与类很相似,而结构是一种值类型,它存储在栈中或者是嵌入式的,结构可以实现接口,可以象类一样拥有成员,但结构不支持继承

24.属性声明语法的第一部分与域声明很相似,第二部分包括一个set过程和/或一个get过程

25.传值方式:
在java中简单数据类型的值传参时,都以传值方式;
在c#中如果加ref则会以引用的方式传值(方法内部改变该参数,则外部变量一起跟着变);
加out与ref基本相同,但out不要求参数一定要初始化.

26.c#保留了指针。unsafe

27.代理:代理(delegate)可以看作C++或者其他语言中的函数指针
代理用来封装可调用方法。你可以在类里面编写方法并在该方法上创建代理,此后这个代理就可以被传递到第二个方法。这样,第二个方法就可以调用第一个方法。
代理是从公共基类System.Delegate派生的引用类型。定义和使用代理包括三个步骤:声明,创建实例,调用。代理用delegate声明语法声明。
 

C#、Java之比较 很多人说C#是微软用来和Java抗衡的武器,因为二者在很大程度上有着惊人的相似

,尽管如此,两者不同的地方也很多,所谓“于细微处见差异”。那么两者的相似和区

别都在什么地方呢?我们从今天开始,会从各个角度来对比C#和Java的特点,希望能对

1、C#和.NET平台的概貌
2000年6月,微软发布C#语言和.NET平台。C#语言是一种强类型的,面向对象的语言
,它具有语法简单、表达力强的特点,而.NET平台则是构成微软的“.NET计划”的基石

.NET平台的核心包括两方面,一方面就是著名的通用语言运行机(Common Language
Runtime),虽然这个名词起得晦涩了点,不过大家可以拿它和Java的虚拟机来作比较,
二者完成的任务大致相同;另一方面就是一大堆通用函数库,这些库函数可以被多种语
言调用,并且通过编译都产生一种共同的中间语言(Intermediate Language),这种语
言也可以拿Java的字节码来类比,虽然完成的方式有些不一样。

2、C#和Java
        下面简单地把C#和Java的相似处列出来,虽然在这里我们重点讨论的是C#和Java的 
不同点,但是了解一下二者的相同之处也是很有必要的。 
二者都编译成跨平台的、跨语言的代码,并且代码只能在一个受控制的环境中运行
自动回收垃圾内存,并且消除了指针(在C#中可以使用指针,不过必须注明unsafe 关键字)都不需要头文件,所有的代码都被“包(package)”限制在某个范围内,并且因为没有头文件,所以消除了类定义的循环依赖所有的类都是从对象派生出来,并且必须使用New关键字分配内存用对象加锁的方式来支持多线程都具有接口(interface)的概念内部类继承类的时候不会以某种特定的访问权限来继承;没有全局函数或者常量,一切必须属于类;数组或者字符串都自带长度计算和边界检查;只使用“.”操作符,没有“->”和“::”;"null”、“boolean”和“bool”成为了关键字;任何变量均在使用前进行初始化;  不能使用整数来返回到if条件语句中,必须使用布尔值;“Try”模块后可以有“finally” ;C#与JAVA之比较(图表说明) 

 

C#

JAVA

目标

提供易用、面向对象、跨平台

提供易用、面向对象、跨平台

GC

丰富的类库

中间语言

IL

JVM

自动生成文档

有(/out生成XML文档)

有(javadoc生成HTML文档)

值类型

都是对象派生的

基本类型是专门的

跨平台

公共语言运行时

虚拟机

操作符重载

结构类型

委托和事件

内置的委托和事件

接口和内部类定义

传递参数

值、引用传递

只能值传递

属性

支持

不支持

枚举

不安全模式

JNI可达到同样效果

分度器

抛出异常

数组

规则、不规则均可

不规则

接口

支持

支持

Switch

可用表达式

只能整数

Foreach

只能用for或while

 

 
                      自从互联网出现以来,Java就成了许多开发者的首选.而许多C++开发者在较短的时间内转移到了Java开发者的队伍中来. Java成功的开发和实现了许多高质量的多线程动画, 游戏, 以及分布的应用程序. 更重要的是,Java 语言是完全平台无关的. 

被称作Apllets(小应用程序)的Java程序在被下载到本地以前必须首先通过安全认证,这样就避免了任何病毒钻入用户的计算机的企图. 许多新的改进,诸如旋摆软件包(swing package), Java2D API, 连网软件包(java .net)在最初的Java开发包发布以后被加进了这种语言里. 从Sun公司发布Java以来,它的许多竞争对手开发了这种热门语言的替代品,一些公司甚至在两年以前就开始了. 

现在一家无需更多介绍的公司--微软已经发布了一种新的叫做微软.NET的技术. .NET家族的一种主要的语言是C#或者说C-sharp. 这种语言是从Java/C++继承而来的. 从我的对C#的六个月的技术上的经验来说,我觉得C#或多或少与Java是相似的.但是C++的许多功能,比方说操作符重载(它在Java中已经被移去了)还存在于C#中. 

Java程序能够在安装了Java虚拟机或者JVM的任何平台上运行.但是.NET程序的平台要求安装了通用语言运行库或者称做CLR. 它是所有.NET语言运行所需的运行库.所以一种.NET语言能够调用另一种.NET语言写成的模块和函数. 更进一步的说,如果你学习了种像C#之类的语言,那么你就很容易学习另一种.NET语言因为所有的.NET语言遵循微软所谓的.NET Framework(架构). 这种架构包括了编写和安装健壮的.NET应用程序所必需的类库.使用.NET你可以通过ASP.NET进行服务器端的编程,这点非常像JAVA中的servlets. 

就象Java中的Applets, C#引入了WinForms 和WebForms的概念.使用WinForms你可以设计基于Windows的应用程序而使用WebForms你能够开发Web应用程序. 这点可以要么通过C#编程或者是使用Visual Studio.NET这样的开发环境工具来实现. 它包含了Visual C#,使用Visual C#你可以非常容易的编写C#应用程序. 

在我们使用Visual C++编程的时候,WinForms几乎就是win32程序.用C++来开发这些程序是可能的.但是VC++给我们提供向导来简化我们的开发过程.现在Visual C#也在做同样的工作.因此如果你已经是一个VC++的程序员了,那么你最好试一试VC#. 
Java程序和C#程序的比较 

我们应该比较一下用Java写成的程序和C#的有什么不同. 我们将讨论两个程序间主要的不同点. 

Hello Java 程序 

class Hello { // 类声明 
public static void main(String args[]) { // main 方法,入口点 
System.out.println("Hello Java"); // 向控制台输出Hello Java 
} 
} 

Hello C# 程序 

using System; // 调用System命名空间 
class Hello { // 类声明 
public static void Main () { // main 方法, 入口点 
console.writeLine("Hello C#"); // 向控制台输出 Hello C# 



在Java中, lang软件包是自动引入的.在简单的程序里没有必要引入这个包.但是在C#中,我们不得不在所有的程序里调用System命名空间. 请记住控制台是System命名空间下的一个类. 试着运行一下上面的程序并查看它们的输出结果. 


Main方法 
Java:你有可能编写一个没有main方法的Java程序,只要这个类是用来作为父类.但是只有类中包含有正确的Main方法的时候程序才能运行. 

C#:没有正确的Main方法就不可能编译C#源程序.如果main方法缺失了,那么编译器就会显示一个错误消息:程序'filename.exe'没有定义入口点. 


继承 
Java 和C#都不支持多重继承而且都提供接口的概念作为多重继承的替代品.但是C#在接口中包括了更高级的内容.请在本文末找出题为新增加的特点的内容. 


操作符和控制流语句 
Java中出现的所有诸如算术,逻辑,自增和自减等操作符都可以在C#中找到. 而Java中的像if, else, if-else, for, do-while, while等控制流语句C#统统支持. 但是C# 增加了C++中流行的goto语句. 


异常处理 
在C#中你可以重用try, catch, finally, throws 语句处理运行时错误(通常也叫做异常).C# 中的异常处理过程除了一些小的不同以外几乎与Java完全相同. C#中System.Exception命名空间是所有异常类的基类. 

多线程 
C#中多线程的应用比起Java来要容易得多.我们可以使用Monitor 和 Mutex类同步线程. 

新增特点 
索引,属性和代理是C#中的新概念.索引几乎与Java中的向量相同. 对其新特点的完全的讨论已经超出了我们的范围.但是我将尽量在这个网站的其它地方解释它们. C#引入了Java所没有的操作符重载的概念.但是Java和C#都支持方法重载. 

让我们回到对接口的讨论,我们能够验证包括在接口中的方法是否是使用is 和 as 操作符实现的.当我们实现接口的时候能避免命名冲突.你甚至可以将两个接口结合到一个中来,并在类中实现这个复合的接口,如下面的代码所示: 
using System; 
public interface First { 
void A(); 
void B(); 
} 
public interface Second { 
void C(); 
} 
public interface Combined: First, Second { } 

class Combineimple: Combined { 
// 这里是程序代码 
// main方法 
} } 

而且C#在显示编译错误的时候还显示它们的错误代码.你可以搜索与SDK有关的在线文档寻找和这个错误代码有关的内容并找出这个错误发生的原因的细节.