Java与C#的比较学习记录(1)
2012-08-11 07:32 java线程例子 阅读(399) 评论(0) 编辑 收藏 举报我在大学学的是C语言,自学和选修的是C++,刚毕业也搞过几天Jsp,写过几个Applet.后来转向delphi做桌面开发,再后来又转向C#做Web开发.最近相对比较闲,决定学习一下Java,以取长补短,经过半天的忙碌,终于搭建起了开发环境,在网上找了一篇入门的教程,经过几个小时的练习(严格说叫复习),基本熟悉了Java的语法和基本的结构.在这里对Java和C#做些简单对比:
1) 历史
Java当然比C#长,而且Java脱胎于C和C++,是典型的C风格,C#也是脱胎于C和C++,但由于C#晚于Java,也借鉴了很多Java的东西(C#之父Anders Hejlsberg)其实也是微软VJ++的主要架构师),另外,由于C#之父也是Delphi之父,因此,C#的体系架构不可避免的带有Delphi的VCL(代码是开放的,是我学习编程受益最多的地方)的影子.因此,单纯从语言上来说,可以这么讲,C#是C系列的集大成者,也是高级语言中的集大成者。
2)语法和风格
都是C风格,书写上都差不多,至于花括号的摆放,那只是一种习惯。基本的语法,除了一些细微的差别外,两者基本相同,下面是一些差异比较:
A)类和接口的继承和实现:C#都采用符号":"来表示,Java采用关键字"extends"和"implements"
B) 访问限定,Java的default等于C#的internal,其它都是一样的。
C) 常量:Java没有const关键字,一般用final达到类似的效果,在这方面C#有readonly,const等关键字,控制上更为灵活一些.
D) 在类的多态方面:由于Java没有C#的virtual和override关键字,在表达上没有C#细致和明确。Java的公共,保护,缺省方法默认都是虚方法,所以Java比较容易实现动态注入(Spring技术),C#的访问安全控制性要灵活很多,但这个也有不好的地方,就是你想动态注入得时候,可能由于不是虚方法而无法注入。
E)静态方法:C#的静态方法是不能继承的,而Java的静态方法是可以继承的(但不能重写,只能覆盖).由于静态方法和属性是属于类本身的,因此我觉得静态方法的可继承其实是没有必要的,而且不利于程序逻辑的管理。
F)基本数据类型:基本的一些关键字都相同,但C#的多一些,具体的对应这里就不说了,这里特别记录一下的就是:Java中的int和Integer是有区别的,涉及到基本类型的装箱和拆箱,但需要特别注意,Integer是当作引用类型的,比如Integer i1=300,i2=300; i1和i2是不相等的,但Integer i1=100,i2=100; 中i1和i2是相等的,区别就是超过255比较就是不等的,而C#中int和Integer是没有区别的(至少在行为上),C#中的装箱和拆箱是与object相关的,虽然性能上有差别,但从基本数据类型的行为上来说是没有差别的。
另外,C#中为基本类型增加了可空类型,这个估计跟java的引用基本类型类似。
G)对象清除:机制都差不多,Java中的finalize和C#的dispose效用相当.
H)异常机制:两者一样。
I) 数组:C#分为两种数组类型,一种是普通数组,一种是锯齿数组,但java中没有区分。
J)泛型:都来自于C++的模板类和模板方法,用法都差不多就,不过具体细节上估计会有差异,这里还没深入了解,不做断言;
K)流程控制:有差别的是switch,Java沿用了C++做法,分支可以重叠,但C#要求每个分支都必须有break.从防止出错上来说,C#比较好,但不可避免的会失去很多技巧性写法和灵活性。
PS:语言之间只有语法的差别,没有本质的差别。