关于JAVA继承、多态、抽象类、接口等性质的学习(2)

关于多态,先看一个简单的例子

class A{
    public void A1(){
        System.out.println("1");
    }
    public void A2(){
        System.out.println("2");
    }
        
}

public class Test2 extends A{
    public Test2() {
        // TODO Auto-generated constructor stub
    }
    public void A1(){
        System.out.println("3");
    }
    public void A2(){
        System.out.println("4");
    }
    
    public static void main(String[] args){
        
        Test2 t1 = new Test2();
        A t2 = new Test2();
        
        t1.A1();
        t1.A2();
        t2.A1();
        t2.A2();
    }

}

从上面例子可以看出,子类重写了基类的A1(),A2()方法,之后分别建立了两个子类对象,将其中一个赋给子类型的引用t1,另外一个赋给基类型的引用t2。接下来对两个引用分别调用A1、A2方法。

3
4
3
4

      上面是输出结果,t1因为是test2类型所以正确的显示出了子类A1,A2方法的结果。但是接下来t2是基类型的,看起来应当输出的是基类A1,A2方法的结果,但是编译器却是输出了子类A1,A2方法的结果。实际上这就是多态性的体现,这里要提到后期绑定这个概念,后期绑定是由编译器完成的,在编译时,编译器不需要获得任何特殊信息就能进行正确的调用。

       

      简单来说就是:父类型的引用可以指向子类型的对象。

 

     还有就是当用父类的引用调用一个父类没有的方法是,要对其进行强制类型转换,例如

      A t1 = new Test1();

      Test1 t3 = (Test1)t1;

      t3.A3();   // 这里的A3假设为子类特有的方法。

 

    套用java编程思想的话说,多态是一项让程序员“将改变的事物与未变的事物分离开来”的重要技术,我们所做的代码修改,不会对程序中其他不应受到影响的部分产生破坏。

 

    注:静态方法只能继承而不能重写,也就是说子类继承了基类的静态方法后,如果调用的话,要视此时的引用是基类型还是子类型,是什么类型的引用就调用谁的方法。

 

    最后总结一下多态的特性:

   首先得有继承关系存在,接下来基类的方法是要被重写的,而且该方法必须是public,最后子类创建的对象要指向父类的引用。

posted @ 2015-10-14 14:28  Dvoraks  阅读(120)  评论(0)    收藏  举报