Java 学习笔记(一)
从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 不能指定实现那个接口的方法 ,假如两个接口都有同名的方法,则全部被实现。