http://www.cnblogs.com/javathread/archive/2012/08/11/2634893.html

我在大学学的是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#比较好,但不可避免的会失去很多技巧性写法和灵活性。

http://www.cnblogs.com/javathread/archive/2012/08/11/2634892.html

1) I/O:这个东西其实比较没什么意义,不过java的流概念跟C#的流概念其实都差不多,继承体系都差不多,只是Java中是Input,Output,而C#中是Read和Write.其实各自支持类中的方法名大部分都相同.当然,C# 除了流支持外,还兼容原来的一些文件读写.
2)序列化:对象的序列化两者都有支持,做法都差不多,当然,C# 中除了二进制序列化外,还可以序列化成XML格式(Java中有不有还有待更进一步了解).序列化的用途其实也差不多(主要是RMI).
3)反射机制:两者的反射机制差不多,当然,在这个方面C#的要完善一些,还加入了元属性(Attribute)的概念(Java中有不有类似的东西,学到目前还没发现,Java中的注解在C#中应该是///表达的东西).C#的反射内在机制我比较了解,Java的就不是很了解。但这种东西在Delphi中很早就有类似实现,只是没有现在的C#这样完善。当然,delphi还是欠缺些,而Java和C#都足够用。
4)多线程:这个其实是与语言无关的东东,不过在Java和C#中基本的实现方法还是差不多,类名都一样,只是方法名一个是run,一个叫Execute.Java中可以用Runable接口来简化线程的创建,C# 中是用方法和委托(包括Lamda表达式)来完成同样的工作.C#中的线程池(严格讲这属于框架而不是语言),后台任务之类的可以看作是一些二次封装的东西,没有对比的价值.
5)代码注入:C#和Java都是基于中间语言(C#的IL,Java的字节码),因此在实现代码注入上都比较方便,因此Spring中的面向方面的实现方法在C#中也很容易实现(可以参考我前面的博文).

6)重载:双方都支持方法的重载,而且规则基本差不多.为了简化这种重载C#中可以用参数缺省和params关键字来减少方法的个数,比如public void DoF(params object[] pms),调用的时候可以是DoF(p1),也可以是DoF(p1,p2...)等,这个在Java中是使用"..."来定义的:public void DoF(Object...pms).Java不支持参数缺省,参数缺省有其方便性,但不是必需(Delphi中很早就支持)。

7)委托和事件:这是带有函数指针,回调方法等味道的东东,找了一下,在Java中没有类似的概念,如果需要实现类似的东西,需要用到设计模式,比如观察者,代理等。C#,Delphi都有这个东西,这其实还是个非常好用的东西。我觉得Java完全可以借鉴升级一下(我查了一下,Java确实没有类似的东西,当然,也可能是我孤陋寡闻),Java没有这个可能是源于对纯面向对象语言的追求和对指针滥用的某种不安。
补充:经过查阅资料,Java中也有回调函数的实现,但实际上,这不是真正意义上的回调函数,只是一种模拟类似功能的东西.因为其传入的其实不是方法,而是类.从这个角度来看,我前面说的关于Java没有委托和事件的原因,估计是对的.

8)逆变和协变:其实只要是面向对象编程,存在继承就有这两种情况(方法的参数和返回值)。但大家只要把握一个原则:老子能用的地方儿子也能用,反之则不然。

总结:如果你对数据结构,操作系统,算法,面向对象编程等比较了解,其实相互转换还是比较容易的。做为苦B的程序员,完全没有必要为语言的排名而纠结,学习语言要有凌驾于语言层面之上的意识。

Java与C#的比较学习的更多相关文章

  1. 要学Java,怎么高效地学习,怎么规划

    要学Java,怎么高效地学习,怎么规划?   题主是一个个例,99%的人(包括我自己)都没有题主这样的经历,也很难提出具有很强参考性的java学习建议.我倒是之前面试过一个跟题主有点类似的人,拿出来分 ...

  2. Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析

    经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...

  3. Java并发包源码学习之AQS框架(三)LockSupport和interrupt

    接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...

  4. Java并发包源码学习之AQS框架(一)概述

    AQS其实就是java.util.concurrent.locks.AbstractQueuedSynchronizer这个类. 阅读Java的并发包源码你会发现这个类是整个java.util.con ...

  5. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  6. 20145213《Java程序设计》第四周学习总结

    20145213<Java程序设计>第四周学习总结 教材学习内容总结 本周任务是学习面向对象的继承.接口以及之后的如何活用多态.(还真是路漫漫其修远兮啊!)教材也是延续上周艰深晦涩的语言风 ...

  7. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  8. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  9. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  10. 20145330《Java程序设计》第四周学习总结

    20145330<Java程序设计>第四周学习总结 一周两章新知识的自学与理解真的是很考验和锻炼我们,也对前面几章我们的学习进行了检测,遇到忘记和不懂的知识就再复习前面的,如此巩固也让我对 ...

随机推荐

  1. websphere安装验证报错 忘记密码的配置

    http://blog.csdn.net/yulimin/article/details/4048897 ADMU7704E: 在尝试启动与服务器相关联的 Windows 服务时失败:server1: ...

  2. 制作、烧写根文件系统,使用NFS,编译使用驱动程序

    制作YAFFS2.JFFS2文件系统映象文件制作文件系统映象非常简单.① 制作YAFFS2文件系统映象文件对于YAFFS2,要用到mkyaffs2image工具,它在/work/linux/tools ...

  3. mysql分页的问题

    用过mysql的人肯定知道,mysql提供了原生的分页功能-----LIMIT关键字.LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数.LIMIT 接受一个或两个数字参数.参数必须是 ...

  4. form表单中的带有name的标签直接转JSON

    1. 将如下内容引入页面:比如说新建一个 a.js,然后在页面中引入a.js//将form表单序列化成json格式 $.fn.serializeObject = function () { var o ...

  5. Java程序输出打字

    代码: 效果:

  6. eclipse安卓引入库项目的正确方法

    之前清单文件里theme主题老是改不成库项目里定义好的主题@style/Theme.AppCompat.Light,只能用默认主题@style/AppTheme <application and ...

  7. cornerstone 怎么使用

    Cornerstone的逻辑很清晰,界面打开后,左边栏上下分开,上面是working copies的列表,下面是REPOSITORIES的列表.常见的功能基本上跟windows一样,在上下文中可以得到 ...

  8. FirstOrDefault()的重载方法

    FirstOrDefault方法的使用总结: 现有一集合对象list, 其中集合对象调用FirstOrDefault()方法, list.FirstOrDefault()返回集合中第一个元素, 若集合 ...

  9. Notification使用笔记

    之前在项目中使用了Notification,现分享出来: checkNotification() function checkNotification(){ //判断是否支持Notification ...

  10. Food on the Plane

    Food on the Plane time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...