csharp与java的区别_C#和JAVA的不同点

最近在找开发的工作,发现有的时候把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的演示

csharp与java的区别_C#和JAVA的不同点_第1张图片

然后,C#对于命令行输入参数可以这样做

csharp与java的区别_C#和JAVA的不同点_第2张图片

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

你可能感兴趣的:(csharp与java的区别)