多态
late-binding, 在编译前不确定 函数调用和哪个具体实现绑定
RTTI运行时刻向下转型
late-binding, 在编译前不确定 函数调用和哪个具体实现绑定
在程序运行期间,再决定函数调用和哪个具体实现绑定。
/*
* polymorphism*/
class S{
public S(){
out.println("S()");
}
public void common(){
out.println("S common()");
}
}
class Sub1 extends S{
public Sub1(){
out.println("Sub1()");
}
@Override
public void common(){
out.println("Sub1 common()");
}
}
class Sub2 extends S{
public Sub2(){
out.println("Sub2()");
}
@Override
public void common(){
out.println("Sub2 common()");
}
}
public class Poly {
public static void main(String[] args){
S[] slist = {
new Sub1(),
new Sub2(),
new S()
};
for(int i=0; i<3; i++){
//未确定与哪个具体函数实现绑定
slist[i].common();
}
}
}
/*
output:
S()
Sub1()
S()
Sub2()
S()
Sub1 common()
Sub2 common()
S common()
*/
RTTI运行时刻向下转型
/*
* polymorphism and RTTI(Runtime Type Identifier)
* */
class S{
public S(){
out.println("S()");
}
public void common(){
out.println("S common()");
}
}
class Sub1 extends S{
public Sub1(){
out.println("Sub1()");
}
@Override
public void common(){
out.println("Sub1 common()");
}
}
class Sub2 extends S{
public Sub2(){
out.println("Sub2()");
}
@Override
public void common(){
out.println("Sub2 common()");
}
}
public class Poly {
public static void testPoly(){
S[] slist = {
new Sub1(),
new Sub2(),
new S()
};
for(int i=0; i<3; i++){
slist[i].common();
}
}
public static void testRtti(){
S[] slist = {
new Sub1(),
new Sub2(),
new S()
};
Sub1 sb1 = (Sub1)slist[0];//从父类转型至Sub1子类
sb1.common();
Sub2 sb2 = (Sub2)slist[1];//从父类转型至Sub2子类
sb2.common();
}
public static void main(String[] args){
testRtti();
}
}
/*
S()
Sub1()
S()
Sub2()
S()
Sub1 common()
Sub2 common()
*/