java 多态简单说明:用最少的字、简明且易懂的文章来说明

前言

最近在复习面试题目,发现网上找的java多态文章,有的复杂,有的乱,而且有的没说清楚,自己看了很多篇之后,以最少的文字、简介且易懂的文章将它说明白。

定义

一个被定义的引用变量指向哪个类的实体对象、该变量调用的方法具体是属于哪个类的在编译的时候是不知道的,只有在程序运行时才能知道前面两个问题的答案;这样就可以在不修改源码的情况下,根据要求将引用变量指向不同的类,从而可以改变程序的运行状态,这就是多态。

实现多态的必要条件(基于继承实现的多态也叫运行时的多态)

  1. 有继承:存在父类和子类
  2. 有重写:子类重写了父类的某个方法
  3. 有向上转型:子类的实例对象赋值给了父类类型的引用变量:
 //假设A类是B的父类,
 A a = new B( );	//这就是向上转型

向上转型的特点

  1. 父类引用只能访问父类的方法和属性。
  2. 如果子类重写了父类的方法A,那么父类引用调用方法A时,表面上是调用了父类自己的方法A,实际上调用的是子类的方法A,而且实际效果就是子类的方法A的执行效果。

多态的典例(基于继承实现的多态)

  1. 基于继承实现的多态:有父类A,子类B,子类B重写了父类A的方法Add;创建一个B的实例赋值给类型为A的引用变量,即A a = new B( );
    a调用Add方法,会发现Add方法执行的效果其实是子类B里重写的Add方法的执行效果,这就是多态的表现。

方法调用优先级

必须明确两点

  1. 下面的this指new的是哪个类,就指的是哪个类的实例对象。如:A a = new B( ) 那么这里的this指的就是B类型的实例对象。
  2. super指的是找到其直接父类。
  • 方法调用优先级:this.show(obj) > super.show(obj) > this.show((super)obj) >super.show((super)obj)

可能看完这里,你还不太懂得这个优先级怎么用,那么下面以具体代码给大家讲解。

多态典例(以代码讲解,并附带讲解方法优先级如何使用)

  1. 创建四个类A、B、C、D。
  2. 利用向上转型体现多态

代码

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

}
******************************************
public class B extends A{
    public String show(A obj){
        return "B and A";
    }
    public String show(B obj){
        return "B and B";
    }
    public String show(C obj){
        return "B and C";
    }
}
******************************************
public class C extends B{
}
******************************************
public class D extends B{
}```
******************************************
public class TestPolymorphism {
    @Test
    public void run1(){
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        //1、2、3就用到了方法的优先级
        System.out.println("1、" + a2.show(b));
        System.out.println("2、" + a2.show(c));
        System.out.println("3、" + a2.show(d));
    }
}

结果

在这里插入图片描述

讲解

讲解前必须明确一点:这个例子中,this指的是类B的实例对象,如果this调用了类B有的方法,而类A中没有的话,是会直接跳过的,就会往方法的下一优先级找。

  1. a2.show(b) 的执行:
    根据第一优先级:this.show(obj),this指的是类B的实例对象,所以先去类B中找有没有方法show(B obj),发现有,但必须注意,此时引用变量类型是A,所以还要去类A中找有没有方法show(B obj),如果有,那么这行代码的执行结果就是执行类B的方法show(B obj);如果没有,则跳过去找下一优先级。此处会发现没有,那么下一优先级是:super.show(obj),发现类B的父类就是类A,没有方法show(B obj)。那么再跳到下一优先级:this.show((super)obj),发现要找的是类B的方法show(A obj),去类B的父类A中找,也有方法show(A obj),但此时要注意,show(A obj)的执行效果一定是子类类B的方法show(A obj)执行效果, 所以结果为: “1、B and A”。
  2. a2.show©的执行:
    根据第一优先级:this.show(obj),this指的是类B,所以先到类B中找方法show(C obj),结果发现有,那么再去父类A中找有没有方法show(C obj),结果也发现有,那么该行代码的执行效果就是执行类B的方法show(C obj),所以结果为:“B and C”。
  3. a2.show(d)的执行:
    以此类推。

如果觉得作者讲得不错,那就点赞我!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cover.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值