最近在找开发的工作,发现有的时候把C#和JAVA的内容搞混了(JAVA半年没用了,C#差不多有一年半没用了),于是最近在给自己做一个扫盲【只能做个大概,因为细节太多了】,同时做了此笔记以区分。

1.比较C#,C++和JAVA的重要功能

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

分类: C#Java

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注