1.final关键字:final的使用有3种情况
(1)数据:在成员变量中用final修饰,表示了该数据的不变性,根据参数的类型又可以分为两种不同情况。如果该成员变量是基本类型,那么通过final修饰,该变量就不可以改变,如果加上static就表示了该成员变量,作为全局变量使用;如果该成员变量是引用类型,用final修饰,那么该引用不可再变,即引用的指向不可变,但是引用所指向的对象的值可以改变。
final数据的初始化在域的定义处或构造处进行,即final在使用前必须初始化。
final可以修饰方法中的参数,但是只能读不可修改。
(2)方法:方法用final修饰作用主要时为了该方法不能在继承的时候被修改,还有一个作用就是把被修饰的方法的调用转为内嵌调用以提高效率,不过不提倡用该种方式来提高效率,在比较新的jvm中,已经提供了这种功能。
类中private方法都隐式的指定为final。
(3)类:final修饰类时,表示该类不允许被继承,该类中的所有方法都被隐式指定为final方法。
2.继承初始化
当导出类执行时,即使没显示的去调用基类或打算生成一个基类对象,也会先去加载基类中的static域,然后加载导出类的static域,完成类的加载,基类构造器和导出类的构造器一样,以相同的顺序来经历相同的过程。在基类构造器完成之后,实例变量按其次序被初始化。最后构造器的其余部分被执行。
3.动态绑定:
将一个方法调用同一个方法主体关联起来被称作绑定。在运行时根据对象的类型进行绑定称为后期绑定,后期绑定也称为动态绑定或运行时绑定。java中除了static方法和final(private)方法外,其他方法都是后期绑定
4.几个缺陷:
a.只有非private方法才可以被覆盖。所以在导出类中,对基类的private方法。最好采用不同的名字。
public class A{
private void f(){System.out.println("private f()")};
public static void main(String[] args){
A a=new B();
a.f();
}
}
class B extends A{
public void f(){System.out.println("public f()")}
}
输出的结果为:
private f();
b.任何域访问操作都将由编译器解析,因此不是多态。静态方法也不具有多态性,因为它是对类来说,而不是对象。
c.在构造器内部唯一能够安全调用的那些方法是基类中的final(private)方法,调用其他方法会存在隐患。