JavaSE:JAVA VS C#

来源:互联网 发布:sftp 指定端口 编辑:程序博客网 时间:2024/05/02 04:44
这次只是大概列出一些不同点,以把不同点做个备份,详细情况以后专题介绍。

考虑到网上很多资料是“一个人发表,n人转载”或“一个人在n多地方发表同一篇文章”,恰好这些文章为列在搜索页面的靠前部分,所以难以获得多方面信息(由于一些类似的和其他原因,本人不喜欢去论坛)。所以本文尽量保持原创和客观。

运行环境:Fedora Core 8+MonoDevelop 0.9
Note:此环境在我的机器上没有可视化图形设计器,也没有MSDN。.Net版本为1.0和2.0。

(仅关键字不同的部分不在此列举)
(本次不同点大多都是在ATM大作业中遇到的,有些适当扩展了)

1.解决命名冲突
namespace和package都具有防止命名冲突的能力。但是namespace没有对文件系统的布局产生影响。换句话说当你要写程序查找任意namespace类的源码时难以确定其具体位置。

2.clone
C#同时支持struct和class,他们都继承Object。前者与后者的本质区别是前者是值类型而后者是引用类型,(有关其他区别这里不详细列 出)。在代码编写上我的环境中struct和class完全一样,但在vs里会有细微差别,vs的提示很详细,这里不列出了。由于.net framework中兼有了struct和class,并且两者都可以使用new name的方式实例化,猜想正是这个原因导致了C#的Clone方法需要类显式实现Cloneable接口。Java中的Object便直接具有 clone方法。

3.继承
C#继承和实现接口的语法相同,都是“子类名 冒号 父类名和接口列表”。不支持多重继承。同样C#类的构造方法中不允许出现对父类和自己的引用,必须放在构造函数名和冒号的后面(这是C++的方式)。接口 中的成员不许要访问修饰符,因为它们是public的,你写了反而编译器要报怨。

4.代理
这是C#的新机制,但是并非信思想,类似C的函数指针,Java可以用单方法接口来模拟。同时熟悉动态脚本语言如JavaScript的话,便会发现,代理就如同它们的Function对象。不过代理能力更强,因为它可以联接多个方法。

5.属性
C#具有隐式获取和访问方法(get和set),Java没有,但默写Java规范如JavaBeans中有,规则为setXXX和getXXX。其实 C#的属性本质上也是private成员+两个方法(因此C#属性声明可以是abstract的,也可以出现在接口中),和Java效果一样。但是 在.Net 3中,C#编译器可以根据get和set自动添加响应的private属性,这使得C#的属性更纯粹一点,真正保持了代码的简洁。

6.异常处理。
C#不用声明“异常说明”,记在方法名后不用throws,所有C#异常都像Java的RuntimeException。这个使得其他人使用C#的库时不得不查找其文档。(难怪微软的MSDN不是免费的呢)

7多态
这个C#是乱上加乱,共有abstract,virtual,override,new三个关键字。并且C#在实现多态时调用的方法始终是 “override returntype method”的形式,所以不要报怨为何你有了String ToString方法,却还是得不到期望的输出。
有关这个的详细讨论有时间另开专题。

8别名
这个Java里没有,C#中用的最多的地方就是string和String,以及其他基本类型。C#完全面向对象,所以基本类型如int是其对象类型Int32的别名,换句话说它们等价,而java只是用自动包装机制来达到这个目的。

9.事件处理
这个就很复杂了,C#基于“代理”,Java基于“事件监听”。
有关这个的详细讨论有时间另开专题。

就先写这么多吧。
原创粉丝点击