final关键字
1. final作用于基本类型上,就相当于声明了一个在编译时执行计算式的常量。
2. final作用于引用类型上,该变量将不能被赋值到其他变量,但是自身内容可以改变。
3. final作用于成员方法上,该方法将不能被子类覆盖。
4. final作用于类上,该类将不能有子类,即该类不能被新类继承。
类与对象初始化
当执行一段Java代码时,初始化的顺序。
1. 首先加载类,由于静态域和静态代码块属于类不属于对象,所以它们也在对象创建前初始化。同时,静态域与静态代码块的初始化和执行顺序是按照代码书写顺序来进行。(如果该类有基类,则先进行基类的加载,以此类推)。
2.当类加载完成后开始创建对象,对象创建时,先初始化并执行域定义的地方和实例初始化代码块(用{ }包起来的区域),它们的执行的顺序按照代码书写顺序进行,然后调用构造方法。(如果该类有基类,则先进行基类的初始化,以此类推)。
注:当基类初始化时调用了已经在子类中被覆盖过的方法时,若此时绑定的对象为子类对象,则在基类中调用的方法也是子类覆盖的方法。
一些细节
1. 虽然继承很重要,这一技术需要慎用。在选择用继承还是组合时,一个最清晰的办法就是问一问自己是否需要从新类进行向上转型。如果必须向上转型,则继承是必要的;但如果不需要,则应当好好考虑自己是否需要继承。
2. 依照惯例,即是static又是final的域将用大写表示,并使用下划线分隔各个单词。
3. 在Java中,每个类的编译代码都存在于它自己的独立的文件中。该文件只在需要使用程序代码时才会被加载。
4. 实现多态时,Java采用后期绑定的方式来确定具体是哪个类的方法被调用。
5. 只有普通的方法调用可以是多态的,例如直接访问某个域,这个访问将在编译期进行解析。静态方法不具有多态性。
6. 由于只有基类的构造器才具有恰当的知识和权限来对自己的元素进行初始化,所以必须令所有构造器都得到调用,否则就不可能正确构造完整对象。
7. 在编写构造器时有一条有效的准则:“用尽可能简单的方法使对象进入正常状态;如果可以的话,避免调用其他方法。”——见《Java编程思想》P164
8. “用继承表达行为间的差异,并用字段表达状态上的变化”——见《Java编程思想》P165