======================================================
注:本文源代码点此下载
======================================================
从c#转向java是否是一种倒退?
经过一段时间的学习
偶发现c#确实是克隆了java的很多东西,但是在某些方面,c#
作了很大的改进
1. java的基本类型(值类型)
只有以下几种
byte(8) char(16)boolean(-) short(16) int(32) long(64) float(32) double(64)
java 没有无符号类型
对应的引用类型为
byte (8) character(16) boolean(-) short(16) integer(32) long(64) float(32) double(64)
位于java.lang 包中
2. java 文件
每一个java 文件里面最多存在一个public的类,如果存在的话,其名称必须跟文件名完全相同。当然也可以没有public类。
3. 关于类的访问权限
普通的类只能声明为public或者package权限,但是内部类可以声明为private和protected的,内部类里面可以访问外部类的private成员
未在顶部声明 package 的类会被认为属于所在目录的默认package,能够访问当前目录package 类和成员。
4. 构造器
在类没有构造方法时,编译器会为其生成一个默认的无参public构造方法;但是一旦类中存在一个任意形式的构造函数,编译器就不会再做这件事情
5. 访问方法基类
java 的 super 关键字等同于 c#的base 关键字,用于访问基类。使用 super(可选参数) 可以调用基类的构造方法,但是它必须被放在派生类的构造方法的第一行。对于派生类的构造方法可以省略此行,这时调用基类的默认构造方法,单是一旦基类不存在默认构造方法或者其修饰符为private,则不能省略,此时应该调用其他非private构造方法。
6. 构造顺序
1) 按从上往下的顺序执行基类的 静态成员的初始化
2) 按从上往下的顺序执行派生类的 静态成员的初始化 (此处非常重要)
3) 按从上往下的顺序执行基类的 非静态成员的初始化
4) 执行基类的构造方法
5) 按从上往下的顺序执行派生类的 非静态成员的初始化
6) 执行派生类的构造方法
这个顺序跟c#有天壤之别
在非封闭类的构造函数里面最好不要调用非private方法和非final方法,因为如果该方法被重写,将导致调用还未构造的对象的方法,结果可能不同于预期
7. final关键字
java 的final关键字比c#的功能更强。
由final修饰的值类型域变量不能在初始化以后修改
由final修饰的引用类型域变量不能在初始化以后修改引用,但可以改变其域成员的值
final修饰的成员变量可以在声明时初始化或者在构造函数中初始化,而且必须在这两种情况之一中初始化
参数也可以使用final修饰,作用一样
final修饰的方法不能被重写(重写导致编译错误)
private成员是自动final的
final修饰的类不能被继承,相当于sealed
8. java 和 c# 的不同
java 没有提供override 关键字 因为java 没有virtual 关键字,java 的方法默认就是 virtual的。而 c#的方法和属性默认是final的,除非你明确声明为 virtual 或者 abstract ,这将带来性能上的提升,因为默认final的成员不需要进行运行时迟绑定的判断。
java的原始类型(值类型)并非从object继承,只能通过包装成对象来实现转化成引用类型。
java可以使用实例来访问其静态成员,而c#不能。
java 不能指定实现那个接口的方法 ,假如两个接口都有同名的方法,则全部被实现。
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/