JR 精品文章 - Java 和 C#的比较
AD: jr (at) javaresearch.org


首页 | 动态 | 文章 | FAQ  | 新闻 | 下载 | 代码 | 工作 | 调查 | 术语 | 站点 | 图书 | 论坛 | 帮助 | 全部  

TOP | 交流 | 软件 | 专栏 | 开源 | 译/著 | 源码 | API  | 推荐 | FTP  | 积分 | 统计 | 搜索 | Blog | 我们  
首页 » 研究文集 » 其它 搜索标题相关文章 搜索标题相关文章    评论此文章 发表评论     开始监控此文章 开始监控   加入收藏夹  加入收藏夹
Java 和 C#的比较
lanxiazhi 原创   更新:2007-11-01 21:42:21  版本: 1.0   

最近学习C#,因为之前学过java,特做记录对二者进行比较,以免混淆。我会一直更新这个内容,希望各位多发表高见。

2007.11.1
  1。访问控制方面:C#有public、internal、protected、private,比java多了个internal,其实它跟java的包访问差不多,internal表示同一个编译集合(如exe、dll)下的类可以互访。
  对于protected,java和C#有区别。在java中,protected和包访问级别差不多,即不是私有的。而在C#中,protected和private差不多,即它标志的成员是私有的。
  有这样一种情况:类中的一个成员,需要它能被子类访问到,同时能被同一个集合中(无论是java的包还是C#中的编译集合)的其他类访问到,怎么办呢?在java中,只要用protected就行了。在C#中,可以同时指定internal protected(二者的顺序随意)。
  在有这样一种情况:类中的一个成员,需要它能被子类访问到,但不能被同一个集合中(无论是java的包还是C#中的编译集合)的其他类访问到,怎么办呢?在C#中,可以指定protected(二者的顺序随意)。但java就无能为力了。
 2。C#中有static constructor的概念,这跟java中的静态初始模块一样。
    C# : static [类名]{}
     java :static{}
 3。Java中的main函数必须是public static void main(String[] args)的样子,否则虚拟机拒绝运行。C#中,Main函数可以是private的(甚至可以是protected),可以没有参数,可以返回int值。有点像C语言。
 4。发现csc.exe有一个功能很好,100后面加一个小写的L,它会警告:“l”后缀容易与数字“1”混淆;为清楚起见,请使用“L”。
 5.C#提供了一种机制,使得某个变量可以被动态赋值一次,以后就不能再改了。那就是readonly关键字的功能。
 6.java在继承、多态方面,比C#强多了。Java默认的多态,C#要求加上virtual(被继承的方法)和override(继承的方法),而且C#要求不能改变原来的访问修饰符,不像java那样,可以指定更加宽松的访问方式。如果有人利用C#来写程序,必须经常带上virtual和override,还必须照抄原来的访问控制符,不会很郁闷吗?难道有人用C#的面向对象特性时,会舍弃多态的特性?这会引起多大的混乱啊。
  多态是面向对象的精髓,像java那样默认不是更好吗? 
7. C#中new还可以用来指定子类的某个方法要隐藏父类的具有相同签名的方法。这是不是多余的?你不用也可以,不过csc.exe会警告你,如“lan.Other.Main(string[])”隐藏了继承的成员“lan.HelloWorld.Main(string[])”。如果是有意隐藏,请使用关键字 new。
像java那样默认多好啊。
但是话又说回来,C#这样做也是有原因的。如果类B继承了类A,B接下来有添加了一个方法叫做hi(),那是B特有的。然后类A(假设是别人来维护的,你不能看到源码)突然也增加了一个方法hi()。如果B自己那个hi()跟A那个hi()的返回值不一样,当你更新类库A后,可能导致程序运行错误或不能编译。C#就很好就地避免了这种问题。(虽然这种问题出现的概率挺小的…)
8.C#中,防止一个类被继承,要用关键字sealed。而定义一个常量时,要用const。
  像java统一用final多好啊。
9.在C#中,要比较两个引用变量是否指向同一个对象,不能用java中的= =,而要用Object里的ReferenceEquals方法。C#中,不能用一个类的实例去调用该类的类方法,必须用类名。所以java中的o1= =o2等价于C#中的Object.ReferenceEquals(o1,o2)。
10.C#中没有原始类型的包装类,但是也提供自动装拆箱的功能,和java有的一样。区别是,C#的装箱是自动的,拆箱就要强制转换了。
int i=100;
object obj=i;
i=(int)obj;
具体怎么装和拆,我们不知道。只知道CLR将int转换成object了。
11.java的内部类有时候帮助很大。到了C#那,就只提供静态的内部类了。这意味着外部类只相当于是一个命名空间而已。C#中的内部类能访问外部类的私有成员,这可能会让它有点用。
[light][light][light][light]

版权声明   给作者写信
本篇文章对您是否有帮助?  投票:         投票结果:     16       1
作者其它文章: 作者全部文章
评论人:yufei2999 发表时间: Fri Nov 02 15:23:15 CST 2007
好,继续关注
评论人:sean_greentea 发表时间: Sun Nov 04 07:40:59 CST 2007
还可以补充很多,比如c#可以swtich String,java不行
评论人:lanxiazhi 发表时间: Sun Nov 04 19:29:50 CST 2007
谁能告诉我怎么修改已发表的文章啊?帮助里的不行。
评论人:haoxz11 发表时间: Mon Nov 05 09:52:21 CST 2007
很详细不错。:)
评论人:wxylwy 发表时间: Tue Nov 06 14:48:28 CST 2007
很 不错的东东
评论人:yjg2008 发表时间: Wed Nov 07 09:20:35 CST 2007
[V] 总结的很好,学习中..........

这个文章共有 6 条评论
主题: Spring的一些整理 上一篇文章
返回文章列表 返回〔其它〕
下一篇文章 主题: 与银行联网时出现的全角半角的问题解决方法


文字广告链接
        自主、快速定制基于JAVA的B/S业务系统          重量级企业在线自定义WEB报表平台
        Excel制表、零代码发布、打印、图表结合——快逸报表,免费、稳定、功能强大的java工具
        技术圈: 关于Java、dotNet、PHP、Ruby、奇客、Web2.0等更多资讯博客精选文章

关于 JR  |  版权声明  |  联系我们 

©2002-2006 JR 版权所有 沪ICP备05019622号