现在的位置: 首页 > 综合 > 正文

JAVA 多态

2018年05月09日 ⁄ 综合 ⁄ 共 1716字 ⁄ 字号 评论关闭

Java多态

方法的重写、重载与动态连接构成多态性。

多态分两种:
(1)编译时多态(设计时多态):方法重载(Overloading)。
 
(2) 运行时多态:方法重写(Overriding)JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪
个方法则被称为运行时多态。

(我们平时说的多是运行时多态,所以多态主要也是指运行时多态)

运行时多态存在的三个必要条件:
(1)、要有继承(包括接口的实现);
(2)、要有重写;
(3)、父类引用指向子类对象。

使用父类类型的引用指向子类的对象,该引用调用的是父类中定义的方法和变量,变量不能被重写(覆盖);
如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;

/*
多态:混合重载与重写
*/

class A{

public String show(D obj){
//D类型参数
return ("A and D");
}

public String show(A obj){
//A类型参数
return ("A and A");
}
}

class B extends A{

public String show(B obj){
//B类型参数
return ("B and B");
}

public String show(A obj){
//A类型参数
return ("B and A");
}
}

class C extends B{
}

class D extends B{
}

/**
 *测试类
*/
public
class DuotaiDemo 
{
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(a1.show(b));   
System.out.println(a1.show(c));  
System.out.println(a1.show(d));   

System.out.println(a2.show(b));   
System.out.println(a2.show(c));   
System.out.println(a2.show(d));   

System.out.println(b.show(b));     
        System.out.println(b.show(c));     
        System.out.println(b.show(d));        
}
}

/*
答案
              ①   A and A
              ②   A and A
              ③   A and D
              ④   B and A
              ⑤   B and A
              ⑥   A and D
              ⑦   B and B
              ⑧   B and B
              ⑨   A and D

实际上这里涉及方法调用的优先问题 ,优先级由高到低依次为:
this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
*/
比如④,a2.show(b),a2是一个引用变量,类型为A,则this为a2,b是B的一个实例,于是它到类A里面找show(B obj)
方法,没有找到,于是到A的super(超类)找,而A没有超类,因此转到第三优先级this.show((super)O),this仍然是a2,这里
O为B,(super)O即(super)B即A,因此它到类A里面找show(A obj)的方法,类A有这个方法,但是由于a2引用的是类B的一个对
象,B覆盖了A的show(A obj)方法,因此最终锁定到类B的show(A obj),输出为"B and A”。
        再比如⑧,b.show(c),b是一个引用变量,类型为B,则this为b,c是C的一个实例,于是它到类B找show(C obj)方法,
没有找到,转而到B的超类A里面找,A里面也没有,因此也转到第三优先级this.show((super)O),this为b,O为C,(super)O即
(super)C即B,因此它到B里面找show(B obj)方法,找到了,由于b引用的是类B的一个对象,因此直接锁定到类B的show(B obj),
输出为"B and B”。

抱歉!评论已关闭.