/**
*
*/
package com.tjb.foundation.test;
/**
* @author tjbworkshop
*
*/
class A{
public String f(D obj){return ("A and D");}
public String f(A obj){return ("A and A");}
}
class B extends A{
public String f(B obj){return ("B and B");}
public String f(A obj){return ("B and A");}
}
class C extends B{}
class D extends B{}
public class OverRideTest {
/**
*
*/
public OverRideTest() {
super();
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.f(b)); //A and A
System.out.println(a1.f(c)); //A and A
System.out.println(a1.f(d)); //A and D
System.out.println(a2.f(b)); //B and A
System.out.println(a2.f(c)); //B and A
System.out.println(a2.f(d)); //A and D
System.out.println(b.f(b)); //B and B
System.out.println(b.f(c)); //B and B
System.out.println(b.f(d)); //A and D
}
}
1、前期绑定,又叫静态绑定;一般指重载,以及final、private、static成员函数。
2、后期绑定,又叫动态绑定,即多态。一般指覆写。
在多态中的调用有这样的规则:
调用成员变量时,将调用引用类型所对应的类中的成员变量的,如果该类中没有定义的该变量,才会调用父类(有定义)的同名成员变量。
调用成员方法时,将根据对象的运行时的类型来确定调用哪个成员方法,也就是说运行时类型是哪个类的引用,就调用哪个类中定义的成员方法
a2.f(b)
重载过程:
this.f(o)------A.f(B),不存在的方法
super.f(o)--------A无父类,不进行
this.f((super)o)---------A.f(A) 找到,所以重载的结果是A.f(A)
super.f((super)o);
3、构造函数与多态,初始化一个子类实例的顺序是:先调用父类构造函数--->父类成员的初始化赋值---〉子类的构造函数方法体;当父类的构造方法中调用一个被子类覆写的方法时,实际调用的是子类的函数,但是有可能出错,因为这时子类的初始化动作尚未完成,如果该函数中涉及到这些初始化内容,那么有不可预测的错误发生。所以在构造方法中最好不要调用方法。
4、abstract与static不能一起使用。因为static本质是静态绑定,而abstract本质是动态绑定的;