java 面向对象的多态性

时间:2022-03-14 11:46:55

        这些日子闲来无事看看 java,以前写 的那几篇类型转化的帖子 都是为了说明什么是面向对象的多态性。当然我学的东西都是从张孝祥老师的《java就业培训教程》学来的,张老师虽然去世了,但是他留下的书和视频,在我看来依然是每一个程序员的入门必选佳作。

        话要少说,事要多知,直奔主题,上代码。

class A{
public void func1(){
System.out.println("A func1 is calling");
}
public void func2(){
func1();
}
}

class B extends A{

@Override
public void func1() {
System.out.println("B fun1 is calling");
}
public void func3(){
System.out.println("B func3 is calling");
}

}
public class C {
public static void main(String args []){
B b=new B(); //新建一个 b类对象
A a=b; //b类对象的地址传给一个a类引用类型变量
callA(a); //a应用传递给callA
callA(new B()); //直接把B对象做为一个A对象传递给函数
}

public static void callA(A a){
a.func1();
a.func2();

}
}

    这个程序 的输出结果是:

    B func1 is calling

    B func1 is calling

    B func1 is calling

    B func1 is calling

    分析一下上面的过程:

    传递给callA()方法的引用a所指向的是一个B类型 的对象,所以这里调用的是B类型的func1(),func2()方法。如果传递给callA()方法的引用a 是真的指向一个A类型的对象,那么这里调用 的肯定是A类型的方法。这样的话在子类型向父类型转化的过程中我们实现了一种特殊的效果:使用父类型的引用来调用一个方法,如果引用指向的 是父类型的对象,那么调用的是父类型的方法;如果引用指向的是子类型的方法调用的就是子类型的方法 ,也就是说相同的输入却出现了不同的输出 ,这就是面向 对象的多态性。换种方式说,A是父类,B是子类,申请 一个B类的对象赋值给一个A类型的引用,这样以后就可以使用A来调用B中对A重写的 方法,也就是实现了向后兼容性。