最近在找开发的工作,发现有的时候把C#和JAVA的内容搞混了(JAVA半年没用了,C#差不多有一年半没用了),于是最近在给自己做一个扫盲【只能做个大概,因为细节太多了】,同时做了此笔记以区分。
1.比较C#,C++和JAVA的重要功能
功能C#C++JAVA
继承允许继承单个类,允许实现多个接口允许从多个类继承允许继承但各类,允许实现多个接口
接口实现通过关键词“interface”通过抽象类通过关键词“interface”
内存管理由运行时环境管理,使用GC需要手工管理由运行时环境管理,使用GC
指针支持,但只在很少使用的非安全模式下才支持,通常以应用取代指针支持,一种很常见的功能,C/C++语言的灵魂就在指针完全不支持,用引用取代
源代码编译后的形式.NET中间语言(IL)可执行代码字节码
单一的公共基类是否是
异常处理异常处理返回错误异常处理
2.方法取名
JAVA:方法名首字母小写
C#:方法名首字母大写
3.溢出
C#的整数运算在除以0时会报错,但是浮点数在除以0时不会报错,但会返回几个特殊值。
NaN表示Not a Number
显示∞符号,无穷大表示
显示-∞符号,表示负无穷大
JAVA则是
NaN表示Not a Number
Infinity表示无穷大
-Infinity表示负无穷大
4.常量
JAVA:用static final修饰符
C#:直接用const关键词申明
补一条:字符串关键字
JAVA:String
C#:string
再补一条:布尔类型
JAVA:boolean
C#:bool
5.GOTO
JAVA,绝对不支持,多用break和continue解决去
C#,支持但是不允许goto转入到语句块的内部【个人认为少用】
当初写C++的时候做一些竞赛题,很喜欢用goto做一些特殊情况的跳转,后面写工程了觉得这种思维非常不好,很容易产生bug,所以现在我是厌恶goto者。
6.公用类的入口点
在Java中,公用类的入口点是一个名为main的公用静态方法。main方法的参数是String对象数组,它没有返回值。在C#中,main方法变成了公用静态方法Main(大写的M),Main方法的参数也是一个String对象数组,而且也没有返回值,如下面的原型声明所示:
public static void Main(String[] args)
但是,C#的Main方法不局限于此。如果不向Main方法传递任何参数,你可以使用上述Main方法的一个重载版本,即不带参数列表的版本。也就是说,下面的Main方法也是一个合法的入口点:
public static void Main()
另外,如果你认为有必要的话,Main方法还可以返回一个int。例如,下面代码中的Main方法返回1:
using System;
public class Hello
{
public static int Main()
{
Console.WriteLine("Done");
return 1;
}
}
与此相对,在Java中重载main方法是不合法的。
7.switch语句
JAVA:switch只能处理整数
C#:switch可以处理字符变量
C#对于switch的演示
然后,C#对于命令行输入参数可以这样做
8.foreach
C#的用法是
foreach(type objName in collection/Array)
JAVA的用法是:
for(type variableName : array|connection){
//variable自动迭代访问每一个元素
}
9. C#没有>>>移位操作符
C#支持uint和ulong之类的无符号变量类型。因此,在C#中,右移操作符(即“>>”)对于无符号变量类型和带符号变量类型(比如int和long)的处理方式不同。右移uint和ulong丢弃低位并把空出的高位设置为零;但对于int和long类型的变量,“>>”操作符丢弃低位,同时,只有当变量值是正数时,“>>”才把空出的高位设置成零;如果“>>”操作的是一个负数,空出的高位被设置成为1。
Java中不存在无符号的变量类型。因此,我们用“>>>”操作符在右移时引入负号位;否则,使用“>>”操作符。
10.包package
C#中,包被称之为命名空间。把名称空间引入C#程序的关键词是“using” 。如 using System 则引入了System名称空间。
C#允许命名空间指定别名:如:
using TheConsole = System.Console;
public class Hello
{
public static void Main()
{
TheConsole.WriteLine("使用别名");
}
}
就概念而言:
JAVA:包的名字同时也是存在的实体,他决定了.java文件的目录结构。
C#:物理的包和逻辑的名称之间是完全分离的,也就是名称空间的名字不会对物理的打包方式产生任何的逻辑影响;同时,每一个源码文件可以属于多个名称空间,可以容纳多个公共类。
.NET中包的实体称为程序集(Assembly)。每一个程序集包含一个manifest结构。manifest列举程序集所包含的文件,控制哪些类型和资源被显露到程序集之外,并把对这些类型和资源的引用映射到包含这些类型与资源的文件。程序集是自包含的,一个程序集可以放置到单一的文件之内,也可以分割成多个文件。.NET的这种封装机制解决了DLL文件所面临的问题,即臭名昭著的DLL Hell问题。
11.默认包
JAVA:java.lang是默认包,无需显示导入就可以直接使用。
C#:没用默认包,一切都需要显示导入
12.可访问性
C#比JAVA多了一个internal
public:成员可以从任何代码访问。
protected:成员只能从派生类访问。
internal:成员只能从同一程序集的内部访问。
protected internal:成员从同一程序集内部或者派生类访问。
private:成员只能在当前类的内部访问。
13.类库
C#没有自己的类库。但是,C#共享了.NET的类库。当然,.NET类库也可以用于其他.NET语言,比如VB.NET或者JScript.NET。值得一提的是StringBuilder类,它是对String类的补充。StringBuilder类与Java的StringBuffer类非常相似。
14.垃圾收集
C#:有GC,也保留了C++内存手工管理方法
JAVA:有GC
15.重写关键字
C# public override string ReWrite_Get() 要求父类方法必须声明为virtual或者是abstract类型
Java @Override(不必须) 如果父方法被final修饰则不可重写 如果类被final修饰则不可继承
C# 有重写和覆盖的概念,可重写的叫虚方法,覆盖的叫实方法,当父类的方法子类有一个重写,有一个覆盖,子类赋给父类之后,调用这两个方法,重写的会执行子类,覆盖的会执行父类。被virtual声明才可以重写
Java 父类方法不需要特殊标记,都可以被重写,不区分重写和覆盖。
java interface 有一种default方法 实现类可以不必覆写default方法。default方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是default方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。
default方法和抽象类的普通方法是有所不同的。因为interface没有字段,default方法无法访问字段,而抽象类的普通方法可以访问实例字段。
C# interface 只能有虚方法
Java interface 可以有静态字段,要使用final修饰 public static final int MALE = 1;
其他的一些内容
泛型不一样,Java泛型只是编译时的,但C#的泛型在运行时也被维持,而且适用于value types 和 reference types
C# 没有 checked exceptions
Java 不允许建立user-defined 的value types
Java 不允许运算符重载
Java 没有类似LINQ的特性
Java 不支持委托
C# 没有匿名内部类
C#没有像java 那样的内部类,所有的nested classes 其实都像Java 的静态nested classses
Java 没有静态类
Java 没有 扩展方法(extension methods)
两者的访问修饰符有一定区别
两者初始化(initialization)的顺序有一定不同。C#初始化变量后才调用父类的构造方法
Java 没有类似“properties”的东西,而是约定俗成为getter 和setter
Java 没有类似与”unsafe”的特性
两者的枚举(enums)有一定的不同,Java的更加面向对象
Java的参数只能传值,没有类似于C#的ref 和out 传递引用。(注:Java 传递对象只是传递对象引用的copy)
Java 没有partial types
C# 的interface 不能定义字段
Java 没有unsigned 的整形
Java 没有类型与nullable 的value types
这篇文章能很好的呃说明问题(非常细致)
http://www.25hoursaday.com/CsharpVsJava.html
Post Views:
78