面向对象的三个特性:封装,继承,多态.封装和继承,我都明白.学了Java两个月了,就是搞不明白多态.我在看书的时候,看到多态性时,有一个例子说的是子类能隐式地转换为父类.是不是这就体现了多态性?还是子类对父类方法的重载,也体现了多态性?请高手指导,好让我明白面向对象的多态性是什么东东?~

解决方案 »

  1.   

    哦,这个我明白.那例如这样子呢:
    //子类转换成父类
    class A//A类
    {
    public void func1()//A类的func1()方法
    {
    System.out.println("A func1 is calling");
    }
    public void func2()//A类的func2()方法
    {
    func1();
    }
    }
    class B extends A//B类,B类继承了A类
    {
    public void func1()//重写父类A类的方法
    {
    System.out.println("B func1 is calling");
    }
    public void func3()//B类的func3()方法
    {
    System.out.println("B func3 is calling");
    }
    }
    class Exduotai1
    {
    public static void main(String[] args)
    {
    B b=new B();//新建一个B类的对象实例并赋给引用句柄b
    A a=b;//把对象b的引用赋给A类型的句柄a,因为b原本为B类型的
    //而B又为A的父类,这里系统先自动把子类自动转换为父类,再赋给A类型的引用句柄a,所以这里编译不会出错
    callA(a);//直接访问本类中的callA方法,参数为A类类型的a
    System.out.println();//作用为换行
    callA(new B());//也可以直接将B类类型的对象作为实参,调用到callA方法中的A为类型的a句柄,在这过程中,子类自动转换为父类了
    }
    public static void callA(A a)//callA()方法,形参为A类类型的句柄a
    {
    a.func1();
    a.func2();
    }
    }
    /*
    这里编译没有错误,我们发现,编译器能够自动将类B的实例对象b直接赋给A类的引用类型变量,也就是子类能够自动转换
    成父类类型,另外,我们也看到了,程序可以直接创建一个类B的实例对象,传递给需要类A的实例对象参数的CallA方法,
    在参数传递的过程中发生了隐式自动类型转换,要把一个"男人"对象当作"人"去用,天经地义!
    */在上面,那个参数调用中,B类的对象隐式地转换为A类类型了,那是不是也体现了面向对象的多态性?~