美文网首页Android开发Android开发经验谈Android知识
Java 多态的理解(主要是解释一个网上经典的例子)

Java 多态的理解(主要是解释一个网上经典的例子)

作者: developerzjy | 来源:发表于2017-10-15 15:41 被阅读187次

如题,本文重点不在于介绍什么是多态,所以一些基础的概念就不多说了(需要知道的时候会提一下)。要了解多态的话这里推荐一篇 http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html
本文要解释的例子也是这篇文章里面的,代码如下:

相关类

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 {}

思考以下输出结果

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)); // 1--A and A
System.out.println("2--" + a1.show(c)); // 2--A and A
System.out.println("3--" + a1.show(d)); // 3--A and D
System.out.println("4--" + a2.show(b)); // 4--B and A
System.out.println("5--" + a2.show(c)); // 5--B and A
System.out.println("6--" + a2.show(d)); // 6--A and D
System.out.println("7--" + b.show(b));  // 7--B and B
System.out.println("8--" + b.show(c));  // 8--B and B
System.out.println("9--" + b.show(d));  // 9--A and D

为了方便查看,我把程序的输出结果以注释的形式写在代码里了。上面的代码前3个很好理解,从第4个开始可能很多人就会觉得有一些奇怪了(为什么输出的不是B and B),其实要理解这个很容易,只要默想一下几个基本概念就行了:

  • 什么是重写 (其中一个要求是:参数列表必须与被重写方法的相同)
  • 向上转型和向下转型 (类似于int和long之间的自动转换和强制转换,向上->子转父->自动,向下->父转子->需强制)
  • 理解一句话:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
    (也就是说 View v = new TextView(context),v.setBackground()的话优先调用TextView的setBackground,如果TextView没有重写setBackground的话才调用父类View的setBackground)

上面的3点一定要理解括号里面说的,下面有用


解释第4点

A a2 = new B();
B b = new B();
System.out.println("4--" + a2.show(b));
输出结果:4--B and A

对于 a2.show(b) ,先看a2是什么类型,没错,是A类型的,A类里面有哪些方法呢,看一眼并没有参数是B的show方法,所以a2.show(b)并不会调用B类里面参数是B的方法 (B类里面参数是B的show方法并不是重写的父类方法,它是B类自己的方法,可以加@Override看看报错不,所以A类型的引用a2调不到这个方法),这就是输出结果不是 B and B 的原因。

然后输出结果为什么是B and A?首先不难想到调用的是 show(A obj) 这个参数是A的方法(自动向上转型),又因为子类B重写了这个方法,所以调用了子类里面的show(A obj)方法(这就是要理解的那个:超类引用变量引用子类对象如果子类重写了方法优先调用子类的方法)

好了,根据第4点的理解思路,其他几个应该很容易看懂了

相关文章

  • Java 多态的理解(主要是解释一个网上经典的例子)

    如题,本文重点不在于介绍什么是多态,所以一些基础的概念就不多说了(需要知道的时候会提一下)。要了解多态的话这里推荐...

  • Java 多态之方法调用顺序

    本文例子取于<深入理解java多态性>和,分析 Ja...

  • Java 多态的例子

    多态就是通过继承和动态绑定来决定程序使用哪个实现. 一个简单的例子。 输出结果: 从例子可以看出: 成员变量不具备...

  • java编程思想(一)---笔记

    《java编程思想》这本书被视为java经典,再此总结一些重点知识: 1.java多态性理解 所谓多态就是指程序中...

  • Java 多态的例子详解及原理解析

    多态的存在有三个前提: 1.要有继承关系2.子类要重写父类的方法3.父类引用指向子类对象 看下面几个例子,你就全明...

  • java多态的理解

    多态的三个必要条件:1.继承2.重写3.父类引用指向子类对象 解释:程序中定义的引用变量所指向的具体类型和变量发出...

  • java多态的理解

    实现多态的三个必要条件: 1. 要有继承 2. 要有重写 3. 父类引用指向子类对象

  • Java多态的理解

    多态可以理解为java的特性概括为:允许不同的对象针对不同的场景有不同的体现 例子一继承然后对父类的重写可以让子类...

  • Java——多态的理解

    1.多态就是父类的引用指向子类的对象2.编译看左边,执行看右边 3.子类中定义了与父类中同名同参数的方法,在多态的...

  • Java 关于多态的解释

    转载至知乎回答, 原链接:https://www.zhihu.com/question/30082151/answ...

网友评论

    本文标题:Java 多态的理解(主要是解释一个网上经典的例子)

    本文链接:https://www.haomeiwen.com/subject/xxccuxtx.html