JAVA 多态

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”。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值