1.方法调用绑定:
绑定就是将一个方法调用同一个方法主体关联起来。例如,一个方法的参数是一个Instrument接口,如果有两个类都引用了Instrument接口,Piano和Violet那么,在编译链接的时候,无法确定方法传入的到底是哪一个,只有到了程序执行的时候,执行到这个方法,才能确定到底是哪个类,才能完成具体的类和这个方法的绑定。
绑定分为前期绑定和后期绑定。前期绑定就是在程序执行前,在编译链接的时候就能进行绑定的过程。后期绑定则是在程序运行时根据对象的类型进行确定。
在面向过程的语言中,都是使用前期绑定的方式,例如c语言。而在java语言中,除了static和final方法,(private方法属于final方法)之外,其他所有的方法都是后期绑定。
虽然使用final的方法会因为前期绑定的原因提高效率,但是,大多数情况下,这对提高程序的性能不会有多大的影响。因此,应当根据具体试图的需要决定是否使用final,而不是出于试图提高性能的目的来使用final。
2.一个父类Instrument的子类Wind,以及Wind的子类WoodWind,都可以向上转型到Instrument。
3.不能覆盖私有方法,也就是说,只有非private方法才能被覆盖。如下:
package test;
public class p156{
private void f(){
System.out.println("private f()");
}
}
class Test extends p156{
public void f(){
System.out.println("public f()");
}
public static void main(String args[]){
p156 test=new Test();
test.f();
}
}
当然,这段代码是不能编译通过的,因为在一个类的子类中,是无法去调用父类的私有方法的。
但是,可以说明一个问题就是,一个父类的private方法,是不能被覆盖的。因为所有的private方法实质上都是final的,也就是说,是不能被覆盖的。
4.多态只是针对方法而言的,对于属性来说,不存在多态的概念,如下:
package test;
public class p156_2{
public int size=5;
public static void main(String args[]){
p156_2 test=new Test();
System.out.println(test.size);
}
}
class Test extends p156_2{
public int size=10;
}
打印出来的不会是子类的属性,而是父类的属性值5,因为多态只是针对方法而言的。
5.对于静态方法来说,因为静态方法是与类绑定的,而不是与对象绑定的,因此,静态方法也不会具有多态的特点。