面向对象编程中的多态(polymorphism)

多态的定义:如果编译时和运行时类项不一样就会出现所谓的多态(polymorphism),多态可以向上转型。

  • 编译时类项:声明该变量时使用的类型决定
  • 运行时类项:实际赋给该变量的对象决定

实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

多态存在的三个必要条件:

一、要有继承;
二、要有重写;
三、父类引用指向子类对象。

父类引用生成子类对象,那这个引用只能调用在父类中已经定义过的属性和方法,而对子类自己新定义的属性和方法则不能访问。

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(A obj){  
           return ("B and A");  
    }   
    public String show(B obj){  
           return ("B and B");  
    } 
}  

class C extends B
{
}   
class D extends B
{
} 

public class MultiTest{ 
public static void main(String[] args){ 
        A ab = new B();  
        B b = new B();  
        C c = new C(); 
        System.out.println(ab.show(b));   
        System.out.println(ab.show(c)); 
        System.out.println(b.show(c));
        //结果为:B A ,B A ,B B
} 
} 

A ab=new B();:ab是一个父类引用,之后执行ab.show(b),这时ab先从父类中查找方法,与之匹配的只有show(A obj)方法,而且发现子类重写了该方法,这时动态链接到子类的show(A obj)方法。

b.show(c);:这里,b中有show(A obj)方法和show(B obj)方法,继承层次为C->B->A,根据重载的最近匹配原则,会调用show(B obj)方法。

阅读更多
个人分类: Java
上一篇Swift中的floor()函数
下一篇Swift关于Array的探讨
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭