在前面一篇文章中,我已经介绍了关于java多态中重载的理解与规则

  所以这篇文章主要介绍多态中的覆盖机制。

  首先重载与覆盖除了表现方式不同之外,还有运行时间上的不同,重载是在编译期间就已经可以确定好调用的方法,而覆盖则是在运行期间才能确定。(这是由于覆盖是一般是建立在继承之上的,即需要通过继承链(指针)的查找)

  多态覆盖的主要难度表现在:

  对于一个父类变量,引用的是子类对象,那么需要知道父类变量在调用方法时,调用的是谁的方法。

  一、实例方法在运行多态时的表现

  这是父类方法

public class Forefather {public void normal() {System.out.println("这是父类的普通方法");}
}

  这是子类方法

public class Inheritor extends Forefather{public void normal() {//这里覆盖了父类的同名方法System.out.println("这是子类的普通方法");}}

  多态表现

public class ShowStrange {public static void main(String args[]) {Forefather pfather;//定义一个父类变量Inheritor  pson;//定义一个子类变量pfather = new Inheritor();//创建子类对象pfather.normal();//调用子类方法
//        pson = new Forefather();子类的变量不能创建父类对象pson = new Inheritor();pson.normal();}
}

  运行结果是:

这是子类的普通方法
这是子类的普通方法

这就说明该变量是什么对象时,就调用什么方法,而与声明变量的类无关。

    但是更神奇的在这里:

public class Ancestors {//父类变量public void common() {System.out.println("这是父类的common方法");}public void anceshow() {common();}
}

public class Derive extends Ancestors{//子类变量public void common() {//覆盖父类的同名方法System.out.println("这是子类的common方法");}public void deriveShow() {anceshow();    }public static void  main(String args[]) {Ancestors oa = new Ancestors();oa.anceshow();//执行的是父类的方法Derive ob = new Derive();ob.deriveShow();//执行的是子类的方法
    }
}

运行结果:

这是父类的common方法
这是子类的common方法

  神奇之处就在于ob.deriveshow执行是调用的父类的anceshow方法,而在执行anceshow方法时并未调用父类的common方法,而是返回到子类中执行子类的common方法,相当于自己出去了一圈又找回来了

补充:

讨论完方法后,你是否对于成员变量是否也具有多态性有疑问?

  这里就不补充源代码了,明确的说,对于成员变量而言无论是实例,静态成员,都没有这一特性,对成员变量的引用在编译时就已经确定好了,即声明的变量为那个类,这个成员变量就属于哪个类。

转载于:https://www.cnblogs.com/gambler/p/8585270.html

关于java多态中覆盖的理解相关推荐

  1. Java学习笔记二十六:Java多态中的引用类型转换

    Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...

  2. java什么是成员域成员方法,java多态中的成员绑定

    多态是面向对象的三大特征之一 谈到多态,不得不提的就是,多态中的成员绑定问题. 方法绑定 将一个方法调用同一个方法主体关联起来被称为绑定.若在程序执行前进行绑定(如果有的话,由编译器和连接程序实现), ...

  3. Java 多态中成员变量与成员属性的特点【复习】

    package firstchapter;/*** 多态中成员变量与成员属性的特点*/ public class polymorphic {public static void main(String ...

  4. java synchronized_Java中synchronized关键字理解

    好记性不如烂笔头~~ 并发编程中synchronized关键字的地位很重要,很多人都称它为重量级锁.利用synchronized实现同步的基础:Java中每一个对象都可以作为锁.具体表现为以下三种形式 ...

  5. Java多态中的 向上转型/向下转型

     Java 向上转型和向下转型的详解 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法 ...

  6. java 多态向子类,在Java多态中调用子类

    我有一个超类Shape. Java接受某种形状的颜色,以及几个子类来计算不同多边形的区域.我创建了一个主类,打印出用户想要计算的不同多边形选项. public static void choices( ...

  7. java多态 降低代码耦合性_深度分析:理解Java中的多态机制,一篇直接帮你掌握!...

    Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...

  8. JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例...

    JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第三个特征,何谓多态 ...

  9. java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...

    0 前言 初学JAVA时,总会对一些概念一知半解,相互混淆,不明其设计的用意,如类.对象.重载.封装.继承.多态.覆盖.抽象类.接口概念.为便于理解和巩固,本文将基于一个案例及其变形,展现各个概念的定 ...

最新文章

  1. USERADD命令详解
  2. python之commands模块
  3. html 字符串最后加空格,js给字符串每个字符中间加空格
  4. MongoDB 数据库创建、删除、表(集合) 创建删除、数据的增、删、改、查
  5. JEECG参与2017年度最受欢迎开源项目投票,请投上宝贵一票
  6. Kafka-produce(发送者)
  7. JavaScript文档对象模型DOM节点操作之兄弟节点(4)
  8. java最小泛型demo
  9. Android 学习心得体会
  10. 家庭宽带搭建个人服务器
  11. WebRTC回声消除(1)
  12. 饭前跑步还是饭后跑步 - 饭后多久跑步
  13. 010-lissajous(二)
  14. 快递企业玩转微信扫一扫教程
  15. 冯诺依曼体系结构与操作系统的理解
  16. 一文看懂虚假新闻检测(附数据集 论文推荐)
  17. python + dlib 实现简单疲劳驾驶检测
  18. 【眼动仪】Tobii 卸载问题
  19. java版mc多少钱_我的世界Java版20w48a版本
  20. Internet Download Manager2023最新永久版下载及功能介绍

热门文章

  1. 【收藏】cgroup的简单使用
  2. 请简要说明一下CyclicBarrier和CountDownLatch的区别?
  3. MyBatis在insert插入操作时返回主键ID
  4. Spring Boot @ConfigurationProperties注解的使用
  5. 实现cookie跨域
  6. centos7完全卸载删除nginx
  7. Android实现蝴蝶动画,Android中的动画具体解释系列——飞舞的蝴蝶
  8. gossip 区块链_区块链技术创新生态 Gossiptoken黑马横空出世
  9. 云服务器怎么打开_香港云服务器怎么样?
  10. go 开了多少个goroutine 怎么看_线上 Go 程序偶尔出现异常怎么办?这个思路可解决你的烦恼...