1,命名空间与包
C#为了把实现相似功能的类组织在一起,引入了命名空间的概念(namespace)
Java中与此对应的东西叫做包(package)
2,类的访问控制方面的不同
C#只有两种:public和默认(同internal)
public能被所有的类(同项目中和不同项目中)访问
internal(在class关键字前不加控制符时默认为internal),表明类只能在同一项目中访问
Java也只有两种:public和默认
public能被所有的类访问
默认(在class关键字前不加控制符时)只能被同一包中的所有类访问
3,类成员的访问控制
C#中有四种:public,protected,private(默认),internal(注意这里internal和默认是不同的)
public能被所有的类访问
protected只能被子类访问
private(也即不写任何控制符时的默认情况下)只能类内部访问
internal能被同一项目中的类访问
Java也有四种:public,protected,private和默认
public能被所有的类访问
protected既能被同一个中的其他类访问,也可以被不同包中的子类访问
private只能在类内部使用
默认可以被这个包中的其他类访问,如果一个子类与父类位于不同的包中,子类也不能访问父类中的默认访问控制成员
4,C#中类的继承用通过冒号:实现,在Java中用extends
C#中实现接口通过冒号:实现,在Java中用implements
C#中密封类用sealed实现,在Java中用final
C#中常数用const实现,在Java中用final
C#中属性用set,get代码块实现,在Java中一般用类似于C#中的字段代表属性,或者用setter,getter构造器实现
C#中有部分类(partial)的概念,Java中没有
C#中有readonly修饰属性只读,Java中没有
C#中有virtual和override修饰虚方法和重写方法,Java中没有,Java中默认父类中的方法都是virtual的
Java中有static{},synchroized{}代码块的概念,C#中没有
Java中有标签(如labelA:)的概念,C#中没有
C#中子类调用父类的方法用base.method(),Java中用super.method()
C#中用is来判断一个实例是否是某一个类的,Java中用instanceof
C#中用foreach(int i in array)来对数组中每一个元素的遍历,Java中用for(int i : array)
~~~~~~~~~~~~~~~~~~~~~
1. C#命令输入和输出语法是:Console.ReadLine()和Console.WriteLine()(当然不换行的话就去掉Line,这些想必大家都知道,所以文章中只提供比较常用的)。
Java命令输入和输出语法是:System.In.Read()和System.Out.Println()
心得:其实两个语言语法本质都一样就是名字不一样。
2. C#中在一个.cs文件中可以存在多个Public修饰符修饰的类。
Java中在一个.java文件中有且仅能存在一个Public修饰符修饰的类。
心得:目前还不知道为啥java会有这样的限制,不过这一点很容易范错误。
3. C#中Switch语句接受的类型是byte、char、string.
Java中Switch语句接受类型是byte、char、string、int
心得:java语言貌似支持的多一点。
4. C#中存在属性与字段是两个概念,属性是属性访问器,是对字段的封装。
Java中貌似没有属性访问器,属性和字段是一个概念,通过自己实现方法来封装属性的访问,一般是getxxx()和setXXX()方法
心得:这点我还是比较赞同C#的做法,毕竟从编程的角度来说,C#将属性作为语法通用的,不需要用户手动去实现,省去了大量的重复编码。
5. C#中构造函数调用基类或者当前重载构造函数语法是直接在构造函数后面:base()和:this()就可以实现。
Java中相同原理语法是在构造函数模块中的第一条语句使用this()或者super()。
心得:这个我个人觉得c#设计的比较好,因为从程序的可读性方面,这样也容易使得读者容易读懂代码,对于程序员来说也容易区分,比较容易知道运行顺序;而Java的实现方式必须使得使用者记住在第一条语句,有的时候在编写一个大的程序的时候,很有可能会忽略这个。
6. C#中存在静态构造函数,即在类运行时,只执行一次。
Java中是不存在静态构造函数的。
心得:这点我也不知道为啥Java中不存在,不过在网上查了下,有网友说是因为这违背了面向对象的思想,后面也跟了一大堆理由,不过我总看都觉得该网友没有很好理解面向对象思想。这个问题我觉得也值得深入研究,有兴趣的可以跟我一起研究下,至于C#中出现这个,我也没仔细深入研究为什么会出现这个情况,我只知道有的时候在类构造的时候,有些参数是执行一次的,但是细想这些也可以通过其他方法实现,所以暂时也说不出C#中静态构造函数的优点,不过竟然微软定义了该语法,而且是在3.5定义的我相信必有它的用处。
7. C#中继承接口和抽象类都是使用:符号的。
Java中继承用Extends标识符,实现用Implements,且如果同时存在,Extends必须在Implements之前。
心得:C#相对来说是比较自由,直接用:就实现继承和实现。
可是Java中区别比较明确,这点我觉得还是java比较好,这样写的代码比较直观,可读性比较好,虽然写的字数多。
8. C#中用Sealed修饰符表示密封,即不可继承,用Const表示常量。
Java中使用Final修饰符表示密封和常量。
心得:Java中用一个修饰符代表2个功能,从设计角度说,不怎么符合功能单一原则,所以我个人觉得必要的时候还是拆分表示,可读性和区别性会好点。
9. C#的Is运算符可以用于类型的判别。
Java中用Instanceof进行类型的判别。
10. C#中存在Internal修饰符,表示程序集的访问级别。
Java中存在类似的修饰符Default,表示同一类和同一包中的访问级别。
心得:C#中访问修饰符大概有以下几种:
Public:公共的,最大的访问权限。
Internal:程序集的,命名空间级别的访问权限。
Protected:受保护的,类以及子类的访问级别权限。
Private:私有的,只能在该类中访问级别权限。
Java访问修饰符有以下几种:
Public:公共的,最大访问级别。
Protected:受保护的,同一类,同一包中的类和子类访问级别。
Defalut:同一类,同一包中的类访问级别。
Private:私有的,同一类中访问级别。
纵观,其实都差不多,但是平时必须注意,细节决定成败。
11. C#中异常直接用Throw抛出。
Java中如果要抛出异常,貌似必须现在方法或者类定义后面用Throws进行声明。
心得:这点也没深入研究,所以不发表观点。
12. C#中有命名空间,用Using关键字引入。
Java中有包,类似命名空间定义,用Import引入包。
13. C#中同步锁定,用Lock关键字。
Java中同步锁定,用Synchronized关键字。
14. C#基本数据类型中有string,且有包装类String。
Java基本数据类型是没有string,用String取代。
http://blog.csdn.net/kingmax54212008/article/details/49623235
http://blog.csdn.net/kingmax54212008/article/details/49623001
Java的常用包
- java.lang: 这个包下包含了Java语言的核心类,如String、Math、Sytem和Thread类等,使用这个包无需使用import语句导入,系统会自动导入这个包中的所有类。
- java.util: 这个包下包含java的大量工具类/接口和集合框架类/接口。如Arrays和List、Set等。
- java.net: 这个包下包含了一些Java网络编程相关的类/接口。
- java.io: 这个包含了一些Java输入/输出编程相关的类/接口。
- java.text: 这个包下包含一些Java格式化相关的类。
- java.sql: 这个包下包含了java进行JDBC数据库编程的相关类/接口。
- java.awt: 这个包下包含了抽象窗口工具集(Abstract Window Toolkits) 的相关类/接口,这些类主要用于构建图形用户界面(GUI)程序。
- java.swing:这个包下包含了Swing图形用户界面编程的相关类/接口,这些可用于构建平台无关的GUI程序。