多态---简单

本文深入探讨了Java中的多态与动态绑定机制,包括其作用、动态绑定的概念及实现方式,以及多态机制的缺点。文章还通过实例展示了构造方法与多态的关系,解释了协变返回值类型的概念,并提供了详细的代码示例。最后,文章概述了多态机制的核心原则。
摘要由CSDN通过智能技术生成

1:作用

        可以消除类型之间的耦合关系。

2:动态绑定(即多态)

        在运行期才知道对象的类型(或才知道调用的是哪个对象的方法)

        在java中除了static和final(private 也是final的)之外,都是动态绑定

 3:缺点:

         1):父类与子类有同名方法,但父类方法为private的,把子类对象赋值给父类字段,调用同名方法是父类的方法(private方法不能被重载)

         2):多态不会发生在private,域,静态方法中

4:构造方法和多态

       构造方法并不具有多态性(构造方法是static)

       构造方法的初始化顺序(有了多态之后)

             1):基类的构造器初始化(返复递归直到最底层的基本构造器)

             2):成员字段的构造器(用来确保字段都可以被正确的初始化)

             3):自己的构造器 

        继承与清理的顺序

             子类的清理方法中最后一行一定要调用父类的清理方法(否则父类的清理方法将永远不被调用)

           

对于字段:销毁的顺序与声明的顺序相反
对于基类:销毁的顺序先子类后父类

 

问题 
子类构造器初始化时,先调用父类构造器,父类构造器中调用了被覆盖的方法,此时这个方法是子类中的方法

 5:协变返回值类型

      子类中被覆盖的方法,可以返回基类方法返回值的子类型 

 

一个例子:

class A {  
    public String show(D obj) {  
        return ("A and D");  
    }  
  
    public String show(A obj) {  
        return ("A and A");  
    } 
  
}  
  
class B extends A{  
    public String show(B obj){  
        return ("B and B");  
    }  
      
    public String show(A obj){  
        return ("B and A");  
    }   
}  
  
class C extends B{  
  
}  

class D extends B{  
  
}  
  
public class Test {  
    public static void main(String[] args) {  
        A a1 = new A();  
        A a2 = new B();  
        B b = new B();  
        C c = new C();  
        D d = new D();  
          
        System.out.println("1--" + a1.show(b));  //A类中没有参数为b的方法,但有参数为b的父类的方法,所以调用它
        System.out.println("2--" + a1.show(c));  //A类中没有参数为c的方法,但有参数为c的父类的方法,所以调用它
        System.out.println("3--" + a1.show(d));  //A类中有参数为d的方法,所以调用它
        //a2对象是B类,但使用A类的“接口”调用(它访问不到B类的特有方法),B类是A的子类,所以参数为a的方法被覆盖
        System.out.println("4--" + a2.show(b));   //B类中有参数为b的方法,但a类中没有,所以访问不到;它还有参数为b的父类(a)的方法,所以调用被覆盖的方法  
        System.out.println("5--" + a2.show(c));   //B类中没有参数为c的方法,但有参数为b的父类(a)的方法,所以调用被覆盖的方法  
        System.out.println("6--" + a2.show(d));   //B类中没有参数为d的方法,但父类中有,所以调用它
        
        System.out.println("7--" + b.show(b));    //B类中有参数为b的方法,所以调用它
        System.out.println("8--" + b.show(c));    //B类中没有参数为c的方法,其父类也没有,查看它有参数为c的父类的方法,所以调用它
        System.out.println("9--" + b.show(d));    //B类中没有参数为d的方法,但其父类有,所以调用它
    }  
}  

 

补充:

所以多态机制遵循的原则概括为:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

 

抄自:http://blog.csdn.net/chenssy/article/details/12786385

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值