如题,本文重点不在于介绍什么是多态,所以一些基础的概念就不多说了(需要知道的时候会提一下)。要了解多态的话这里推荐一篇 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-多态的理解(主要是解释一个网上经典的例子)的更多相关文章

  1. 关于Java中的继承和组合的一个错误使用的例子

    [TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...

  2. 关于java多态的理解

    要理解多态,就必须有一个大的理解方向,不然很容易绕进去. 首先知道多态的释义:多态性是指一个名词可以有多种语义. 对于java的多态性学习者来说,就是必须要知道多个同名方法在不同情况下的使用规则. j ...

  3. Java经验杂谈(2.对Java多态的理解)

    多态是面向对象的重要特性之一,我试着用最简单的方式解释Java多态: 要正确理解多态,我们需要明确如下概念:・定义类型和实际类型・重载和重写・编译和运行 其中实际类型为new关键字后面的类型. 重载发 ...

  4. 对java多态的理解

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new C ...

  5. Java多态-如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   Cat c = new ...

  6. 考考你对java多态的理解

    请看如下代码, 如果你能不运行得出正确答案, 那你真的超过99%的java程序员了. [本人属于最大头的那部分] public class A{ public String s = "A&q ...

  7. java多态的理解

    面向对象语言中的类有三个特征,封装.继承.多态.封装与继承很好理解,那什么是多态呢? 1.什么是多态? 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同 ...

  8. java多态的理解----部分非原创

    所谓多态,其实就是对于同一件事情,不同的对象要采取不同的行为,或者同一个对象在不同的情况下需要采取不同的行为方式. 不同的对象要采取不同的行为: 这有两种实现方式:接口实现和子类重新父类方法.这两种实 ...

  9. JAVA学习笔记(一):一个小爬虫的例子

    1.import java.io.*;   java.io.*不是一个文件,而是一组类.它是在java.io包里的所有类,*是通配符,比如a*.txt代表的就是以a开头的所有txt文件,“?”是单个词 ...

随机推荐

  1. C#中的扩展方法详解

    “扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.”这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些类 ...

  2. Notepad++ WebEdit插件

    虽然PHP的IDE有很多,但是,我还是比较喜欢用Notepad++这款编辑器,因为比较轻量级,而且用起来比较顺手. 但是最近在改别人写的代码的时候,经常要在选定的php前后插入<?php  ?& ...

  3. Leetcode12--->Integer to Roman(整数转换为罗马数字)

    题目: 给定一个整数,将其转换为罗马数字; 题目很简单,主要是依靠整数和罗马数字的对应表: I= 1:V= 5: X = 10: L = 50: C = 100: D = 500: M = 1000 ...

  4. 06-python进阶-多线程下载器练手

    我们需要用python 写一个多线程的下载器 我们要先获取这个文件的大小 然后将其分片 然后启动多线程 分别去下载 然后将其拼接起来 #!/usr/bin/env python#coding:utf- ...

  5. Thanks for your encourage!

    将近三个月的学习,我的努力换回了代表荣誉的小黄衫,这令我很开心啊...我想是不是要写点什么来表达自己的心情呢=,=  于是就有了以下文字ahhhhhh... 学习心得: (1)学习中总会有失败和成功, ...

  6. linux下文件显示被加锁如何解决?

    1.很多时候从别的机器上拷贝过来的文件,没有权限打开,上面有一个小锁. 2.判断是权限没有,查询ls -al得知文件的的所有者,和所有者在的组都不是本机 3.使用chown改变用户的所有者和所有者所在 ...

  7. iis上的反向代理

    阅读文章: IIS上的反向代理 ARR(Application Request Routing)

  8. 九度oj 题目1188:约瑟夫环

    题目描述: N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的人再从1.2.3开始报数,报p的人再退出圈外,以此类推.    请按退出顺序输出每个退出人的原序号 ...

  9. 九度oj 题目1527:首尾相连数组的最大子数组和

    题目描述: 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的.数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr ...

  10. 【转】[重构]Primitive Obsession

    http://blog.csdn.net/wxr0323/article/details/7913950 Primitive Obsession(基本类型偏执) 偏执这个词实在是有点难懂.百度百科传送 ...