Java和C#语法对比

好久不见. 提交于 2020-03-17 08:57:18

引言    

    工作上需要用到Java和C#,两者语法大同小异,这里做一下简单对比。

语法对比

    Java

C#

访问修饰符 public

修饰类、接口、变量、方法。

对所有类可见。

修饰类、接口、变量、方法。

对所有类可见。

  internal 无。

修饰类、接口、变量、方法。

类,接口的缺省访问修饰符。

同一个程序集的对象可见。

  protected 子类可见。 子类可见。
  private 类内部可见。

变量,方法的缺省访问修饰符

类内部可见。

  default 

类、接口、变量、方法的缺省修饰符。

同一包内可见。

无。
基本类型  

基本类型,无方法可调用。

作为局部变量时,储存与栈。作为字段时,跟随于实例。

值类型,继承object,具有ToString()等方法。

作为局部变量时,储存与栈。作为字段时,跟随于实例。

   布尔值  boolean  bool
   整形  short,int,long  short,int,long
   浮点数  float,double  float,double
 可空基本类型    例如:Integer是引用类型,Integer是int的包装类。  例如: int?其实是Nullable<int>的语法糖,而Nullable<int>依然是值类型。
   布尔值  Boolean  bool?
   整形 Short,Integer,Long  short?,int?,long?
   浮点数  Float,Double  float?,double?
   高精度数值类型  BigDecimal  decimal?
 源文件组织  导入  使用包的概念,关键字import导入 使用命名空间的概念,关键字using导入
   类文件

源文件名要和Public类名保持一致,

最多存在一个Public修饰的类,

文件名后缀是.java

没有java中的限制,

文件名后缀是.cs

 枚举  枚举

关键字enum,

引用类型,

和class差不多,可以有字段和方法,

可以添加私有构造函数

关键字enum,

值类型,

默认继承int,可以继承其他值类型

 常量 常量   关键字final修饰变量,字段,定义时赋值

 关键字const修饰变量,字段,定义时赋值

关键字readonly修饰,可以在构造函数中赋值

 密封  密封  关键字final修饰方法,类,表示不可继承,不可重写  关键字sealed修饰方法,类,表示不可继承,不可重写
 属性 属性

 只有字段概念,

一般情况下是要定义字段XX,方法getXX()和setXX()

 

 C#引入属性概念,简化了操作,

只需要定义XX{get;set;}

 判断类型  判断类型  Instanceof               is
 锁  锁  Synchronized      Lock 
 接口  接口

关键字 implements,

使用注解@Override

和继承类一样,使用符号:

实现类中的方法,不需要使用override关键字,

一般命名需要用大写字母I开头

抽象类

abstract

使用注解@Override

abstract,

重写方法需要使用override关键字

  分部类

partial

可以将分布在不同文件,而在相同命名空间下,相同名称并用partial标识的类合并,多用于wpf,winform框架上。

  匿名类

如Runnable hello = new Runnable() { public void run() { System.out.println("hello"); } };

简化了定义子类的步骤。

无。类似的场景基本都是用委托的

  内部类

在new的使用上,内部类要和外部类关联起来

在new的使用上,内部类和外部类用法无区别

匿名方法 匿名方法

无。

使用delegate声明匿名方法,

   delegate(int x)

   {

   Console.WriteLine("Anonymous Method: {0}", x);

  };

虚拟方法 虚拟方法

默认都是虚拟方法

virtual标识虚拟方法,子类用override重写

静态 静态类 使用关键字static

使用关键字static,

可以有静态构造函数,

 

传参 引用传递

在方法参数加上ref,out,使参数按引用传递

即方法内改变参数的值,也会影响到方法外的值

  不定长参数
如int...
如params int[]
 流程控制  循环

关键字for有两种用法

for(初始化; 布尔表达式; 更新)

{

//代码语句

}

for(声明语句 : 表达式) {

//代码句子

}

 分别为for和foreach

for(初始化; 布尔表达式; 更新)

{

//代码语句

}

foreach (声明语句  in 表达式)
{
//代码句子
}

 字符  字符

String,引用类型,

需要使用方法equals比较是否相等

 string,引用类型,

但用法和值类型类似,可以直接用==比较是否相等,

实现原理就是微软重载了string的==运算符

 

 委托  委托  无。

使用关键字Delegate声明,是存有对某个方法的引用的一种引用类型。

使用+使用委托的多播。

 泛型  泛型

 <T>声明泛型,

T只能是引用类型,

可以用extends和super限制T的类型,

<?> 表示通配,

实际上是假泛型。

 <T>声明泛型,

T可以是引用类型也可以是值类型

使用:表示泛型约束,如T:new()表示T必须要有无参构造函数,

真正的泛型。

 注解与特性   注解与特性

 使用@声明注解,如

@Service
public class AgreementFacadeClientImpl implements AgreementFacadeClient {
....
}

 C#引入attribute作为特性,如

[Export(typeof(IPayModule))]
[Export(typeof(IModule))]
public class PayModule : IModule, IPayModule

{

......

}

索引器 索引器 无。 定义了索引器,就可以使用[]取值。
运算符重载 运算符重载 无。 可以对+,-,==等内置的运行符重载,string的==比较符就是运算符重载的结果。
 集合  列表  List是接口,ArrayList才是实现类  IList是接口,List是实现类
   字典  Map  Dictionary
  集合处理

流式api,

对象.stream().filter(x->x.getCount()>0).collect(Collectors.toList())

Linq

对象.Where(x=>x.Count>0).ToList()

使用上方便很多

lambda lambda

()->{},

入参类型为函数式接口,

实质上lambda表达式会在编译阶段被转换为匿名内部类

()=>{},

入参类型为委托delegate

  方法引用
类::实例方法
类::静态方法
对象::实例方法

 类.方法

扩展方法 扩展方法
无。要实现类似功能,要编写Util类。
 扩展方法是定义在静态类的静态方法,入参中的this代表使用的对象,是单继承的一种补充。
命名规范 命名规范

接口命名和类命名一样,如Module。

私有字段小写字母开头,如test。

方法命名是小写字母开头,如getSomeThing()

接口命名开头要加大写字母I,如IModule。

私有字段开头要加_,如_test。

方法命名都是单词首字母大写,如GetSomeThing()

小结

      基本把语法层面上的常见差异都列出来了,总的来说C#语法上还是先进一些,撸代码变得更加优雅。另外个人能力有限,有些遗漏和错误的,欢迎大家补充和指出。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!