最近在找开发的工作,发现有的时候把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
0 条评论