我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:六合图库 > 多态逻辑 >

构造器与多态

归档日期:04-25       文本归类:多态逻辑      文章编辑:爱尚语录

  我们在文章Java 的继承中已经介绍了,子父类的构造器的加载过程,是按照继承层次逐层向上,在子类的构造器中,如果没有明确指明调用父类的哪一个构造器,那么就会调用默认构造器,确保每个父类的构造器都能得到调用,如果父类中不存在默认构造器,那么编译器就会报错。

  构造器是特殊的方法,实际上是隐式的 static 方法,当构造器涉及到多态的时候,就有必要了解构造器是怎样通过多态在复杂的层次结构中运作,嗯,很有必要。

  我们可以看到有三层继承,当我们调用 Baseball 的构造器的时候,编译器回去寻找其父类 Ball,然后发现 Ball 还有父类 Sport,Sport 类就没有父类了,那么就先调用 Sport 的构造器,然后调用 Ball 的构造器;然后按照顺序初始化 Baseball 的成员变量,首先是 ball,定义的时候就初始化了,初始化的时候发现有父类,先调用父类 Sport 构造器,然后调用自己的构造器,然后初始化 sport 对象,由于没有父类,直接调用父类构造器;最后才是运行 Baseball 自己的构造器。所以打印结果如下:

  运行 Baseball 中的 main 方法,到底会看到啥,我们先理一下。

  首先是 Baseball 的构造器,我们上面讲过了,会逐层往上找,当找到 Sport 类的时候到头了,发现这个类还有成员变量 des,先初始化,然后才是 Sport 的构造器,接着往下到 Ball 类,类似,先初始化成员变量 des,然后执行 Ball 的构造器,接着到 Baseball 类,发现也有成员变量,没办法,先初始化然后才是构造器。终于到 play() 方法了,顺序执行,发现有 super,然后执行父类 Ball 的 play 方法,仍然发现有 super,依次向上。所以最终结果是:

  我们可以看到,构造器初始化的时候,逐层往上(找父类),然后从上往下执行(从父类到子类),如果父类中有成员变量,那么先初始化成员量,然后才是构造器。当运行方法的时候,通过 super 关键字顺序执行,从下往上执行(从子类到父类)。

  刺激的部分来了,我们知道,在一个方法内部,动态绑定是在运行的时候才决定的,因为对象无法知道它属于当前类还是属于它的子类。如果要调用构造器里面的一个动态绑定方法,就需要用到被覆盖的方法,那么问题来了,如果被覆盖的方法在对象被完全初始化之前调用,那么就会出现问题。比如下面这段代码:

  我们发现父类构造器中调用的是子类的 play 方法,但是结果是不是出乎意料,str 的值居然是 null。为什么会出现这种情况,明明已经进行了初始化,脸呢?

  冷静一下,我们理下思路,首先调用 Ball 的有参构造器,往上找,发现有父类,然后调用父类 Sport 的构造器,执行 play 方法,这里就需要注意一下,执行的是子类 Ball 的 play 方法,打印变量 str 的值,这时候 Ball 的有参构造器还没有执行,所以没有重新赋值,直接打印初始值,没毛病,至于结果为啥是 null,这是因为父类构造器再调用子类的方法时,子类这时候还没有完成初始化,所以成员变量 str 还是初始值,这个初始值是 null,而不是赋给它的 “str”。等父类的构造器执行完成后,然后才是子类的成员变量,先初始化为 “str”,然后执行有参构造器,str 的值变为 “ball”。

  这篇文章主要讨论的是,若在一个构造器中调用正在构造的对象的某个动态绑定的方法时会出现的情况。在此之前,我们需要知道构造器是如何在复杂的层次结构中运作的,尽管构造方法并不具有多态性,因为它们实际上是st...博文来自:Alan_Xiang的博客

  java中,多态只会发生于非final,private的方法中。也就是说static静态方法,属性及构造器都不具备多态行为。但是,当构造器中出现多态时,常常引起不必要的且难以发现的麻烦。看如下实例...博文来自:Jerry

  动态绑定:在运行时根据对象的类型调用恰当的方法。Java中除了static方法(构造方法可看做static方法)和final方法(private方法可看做final方法)之外,其他普通方法都是动态绑定...博文来自:Fantasy_Virgo的博客

  构造器是java为我们提供的一个初始化的地方。所以它与我们自己定义的普通方法有着一些特殊之处。当你遇到了复杂的对象的构建过程时,构造器的初始化顺序就变的极为重要了。以下一段代码为大家展示,多层继承与组...博文来自:devY的博客

  我们知道,在调用父类构造器时,得先要调用子类构造器。如果父类有方法f(),子类对其重写了,恰好父类构造器中用到了这个f()方法,那么这个f()调用的是父类中的f()还是子类中已经重写的f()呢?不妨用...博文来自:xdugucc的博客

  一、多态1、多态的三个前提        1)、存在继承关系      2)、子类重写父类方法      3)、父类数据类型的引用指向子类对象2、多态成员访问的特点    Animalam=newCa...博文来自:a274537260的博客

  引言通常,构造器不同于其他种类的方法。涉及到多态时仍是如此。尽管构造器并不具备多态性(因为他们实际上是static方法,只不过该static声明是隐式的),但还是非常有必要理解构造器怎样通过多态在复杂...博文来自:Gold_Spring的专栏

  来源于ThinkInJava中文第四版的162页,构造器内部的多态方法的行为相关内容在多态性中有这样一个问题,如果在一个构造器的内部调用正在构造的对象的某个动态绑定方法(在父类构造器中调用子类覆写...博文来自:ColdCoding的博客

  《ThinkinginJava》Java构造函数的初始化顺序在所有事情发生之前,将该类以及其基类的所有对象分配的存储空间初始化为二进制的零。比如int类型会分配为0,对象会被初始化为null。调用基类...博文来自:cyn618的博客

  finalfinal(关键字)1.修饰方法作用:被修饰的方法不能被重写2.修饰变量final修饰引用数据类型时对象中的成员变量值是可以被修改的被final修饰的对象的地址不能改变(不能重新指向)3.修...博文来自:SuPrEeMm的博客

  多态(polymorphism) “多态”理解 再论向上转型 多态内部机制 正确使用,私有、静态方法及域与多态关系 构造器-多态 协变的返回类型(Covariant return types) 用继承进行设计(纯继承与扩展、向下转型)

  java反射机制测试代码 反射获取private类型的属性,方法,构造器 利用反射,多态实现动态编译

  java中构造器不像C++中的构造器没有动态绑定,java中的构造器遵循多态原则。动态绑定是在运行时决定的,因为对象无法知道他是属于那一个类,这就使构造器出现了两难的问题:如果构造器中正在调用构造器所...博文来自:CuiBQ

  设计构造器的规则:用尽可能简单的方法使对象进入就绪状态;如果可能,避免调用任何方法。例子abstractclassGlyph{abstractvoiddraw();Glyph(){System.out...博文来自:衣带渐宽终不悔,为伊消得人憔悴。

  封装:封装是一个概念,它的含义是把方法、属性、事件集中到一个统一的类中,并对使用者屏蔽其中的细节问题。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。比如...博文来自:android程序猿HJ的博客

  纸上得来终觉浅ThinkinJava第八章多态1.实现向上转型的原因是由于动态绑定的存在,就是在运行时根据对象的类型对其进行绑定,编译器不知道对象的类型,但是运行中,能根据对象类型调用正确的方法并调用...博文来自:Jintao_Ma的博客

  构造器调用的层次结构带来一个问题,如果在一个构造器的内部调用正在构造的对象的一个动态绑定方法,会出现什么情况?在一般的方法内部,动态绑定的调用是在运行时决定的,因为对象无法知道它是属于方法所在的那个类...博文来自:Megustas_JJC的博客

  最近复习Java的一些基础知识,看到构造器和多态这块,简单记录一下复习的内容构造器构造器实际上是隐式声明的static方法,父类的构造器总是在子类的构造过程中被调用,而且按照继承层次逐渐向上,以使每个...博文来自:weixin_33953249的博客

  多态,也称作动态绑定,后期绑定或运行时绑定构造器内部多态方法一般的情况下多态并不会给我们带来很大的困扰,但下面的例子例外publicclassDemo3Test{publicstaticvoidmai...博文来自:醉花阴柳的博客

  OOP多态和构造器执行顺序在java的面试题中,对象的初始化顺序配合多态是一种常见考题!今天我就来详细的回顾一下!类中一般包括这几个部分:静态成员包括静态的成员变量静态代码块、非静态的成员变量构造函数...博文来自:kanbujian

  本人的很多内容来自于java编程思想1.构造器和多态:构造器的调用顺序:基类的构造器总是在派生类的构造过程中被调用,而且按照继承层级逐渐向上链接以此来使每个基类的构造器都能得到调用这样做的原因是检查对...博文来自:花前月下人

  /* 多态:同一个对象(事物),在不同时刻体现出来的不同状态。 举例: 猫是猫,猫是动物。 水(液体,固体,气态)。 多态的前提: A:要有继承关系。 B:要有方法重写。 其实没有也是...博文来自:nrsc

  WEB开发笔记每日练习PHP高级对象构建——多个构造函数的使用构建对象是PHP面向对象编程设计中的一个重要主题。在最简单的情况下,普通构造函数就够用了,但如果要开展更为复杂的...博文来自:乐意黎 - daza.ren 打杂人 自述

  分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击构造器不能被继承,因此不能被重写,但可以被重载。......博文来自:了解→熟悉→掌握→精通

  1.简介构造一个类的实例时,将会调用沿着继承链的所有父类的构造方法。当构造一个子类的对象时,子类构造方法会在完成自己的任务之前,首先调用它的父类的构造方法。如果父类继承自其他类,那么父类构造方法又会在...博文来自:Rosun

  前言    基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。这样做是有意义的,因为构造器具有一项特殊任务:检查对象是否被正确的构造。导出类只...博文来自:mufeng_慕枫学习笔记

  构造器构造器可以被重载但是不能被重写同一个类里具有多个构造器,多个额构造器的形参列表不同,即被称为构造器重载.构造器重载允许java雷利包含多个初始化逻辑,从而允许使用不同的构造器来初始化java对象...博文来自:羸鹄的博客

  如果在超类的构建器中调用了子类覆盖过的方法,则编译器默认会调用在超类构建的过程中调用已经被子类覆盖过的方法,而不是超类中的原始方法。这种错误很难从逻辑上进行排查,所以一定要格外小心!以下是例子:c...博文来自:的博客

  首先Java实现多态有三个必要条件:继承、重写、向上转型。        继承:在多态中必须存在有继承关系的子类和父类。        重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用...博文来自:以前冷现在热

  在构造器内部调用正在构造的某个对象的某个动态绑定方法。即在基类构造器中调用被子类覆盖的方法。所以此方法所操纵的某个成员可能还未进行初始化。解决该问题的办法在于:对象初始化首先会在其他任何事物发生之前,...博文来自:mym的专栏

  Java类中的构造器是隐式static的,每个类都有一个默认构造器,在实例化类的对象时就要执行,并检查对象是否被正确的构造。那么当一个派生类甚至多层继承的类被实例化时,执行顺序是怎样的呢?下面进行测试...博文来自:哆啦U梦的博客

  问题引入:比如:如果我们想在父类的构造函数中调用虚函数,当定义子类对象的时候,父类的构造函数中的虚函数执行的是子类中的函数。...博文来自:Be The Best!

  封装是把过程和数据包围起来,对数据的访问只能通过自定义的接口,这个可以保护里面的数据和结构不被修改。继承是实现代码复用的重要手段,Java的继承具有单继承的特点,每一个子类只允许有一个父类。通过继承子...博文来自:betterAndroider的博客

  首先我们来安装python 1、首先进入网站下载:点击打开链接(或自己输入网址),进入之后如下图,选择图中红色圈中区域进行下载。 ...博文来自:陌上行走的博客

  小憩之后,继续为你解读AndFix热修复框架,呵呵。上一篇Alibaba-AndFix Bug热修复框架的使用已经介绍了AndFix的使用,这篇主要介绍AndFix原理以及源码解析。AndFix原理A...博文来自:我是乔同学

  转载请标明地址:一路有你,2017一起奋斗! ...博文来自:高磊的专栏

  介绍  在介绍Bugly之前,需要先向大家简单介绍下一些热更新的相关内容。当前市面的热补丁方案有很多,其中比较出名的有阿里的AndFix、美团的Robust以及QZone的超级补丁方案。但它们都存在无...博文来自:Chay_Chan的博客

  脚本开发方式:方式一:使用shell脚本方式; 1.下载vim for mac 2.打开搜索 , 输入ter,打开终端窗口 3.输入vim,进入vim的编辑界面 ...博文来自:苦练杀敌本领

  1. 前言 隐马尔科夫HMM模型是一类重要的机器学习方法,其主要用于序列数据的分析,广泛应用于语音识别、文本翻译、序列预测、中文分词等多个领域。虽然近年来,由于RNN等深度学习方法的发展,HMM模型...博文来自:tostq的专栏

  Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的Thread...博文来自:u011860731的专栏

  本文转载自本系列文章分为三个部分,首先对HEVC标准做一个介绍,然后回顾...博文来自:liangjiubujiu的博客

  公司产品之前使用xmpp作为底层库,之前同事编译自己的sdk静态库想生成.a库,但是各种编译问题(其实耐心修改配置都能解决),但是从百度找到方案用framework可以解决,所以最终使用的是frame...博文来自:mingming24的专栏

  “机器学习”是一个很实践的过程。就像刚开始学游泳,你在只在岸上比划一堆规定动作还不如先跳到水里熟悉水性学习来得快。以我们学习“机器学习”的经验来看,很多高大上的概念刚开始不懂也没关系,先写个东西来跑跑...博文来自:龙心尘

  连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用。当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接。当这个连接使用完毕后,将返回到连接池中,等待为...博文来自:Napoleon的专栏

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗! Docker的三大核心概念:镜像、容器、仓库 镜像:类似虚拟机的镜像、用俗话说就是安装文件。 容器:类似一个轻量...博文来自:我走小路的博客

  ATSHA204A加密芯片是ATMEL公司研发的一款高安全性的,功能丰富的加密IC,使用SHA-256算法进行加密操作,内置16*32字节的slot(EEPROM)可以存储用户数据和秘钥,唯一的9字节...博文来自:a5882230的专栏

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...博文来自:Lynn_Blog

  Cocos2d-x 2.2.3 使用NDK配置编译环境2014年6月11日 Cocos2d-x 3.0以下的开发环境的配置恐怕折磨了很多人,使用cygwin配置编译环境足够让初学者蛋疼一阵子了。本篇博...博文来自:巫山老妖

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:Websites

  测试环境莫名其妙有几条重要数据被删除了,由于在binlog里面只看到是公用账号删除的,无法查询是那个谁在那个时间段登录的,就考虑怎么记录每一个MYSQL账号的登录信息,在MYSQL中,每个连接都会先执...

  自己整理编写的逻辑回归模板,作为学习笔记记录分享。数据集用的是14个自变量Xi,一个因变量Y的australian数据集。 1. 测试集和训练集3、7分组 australian ...

本文链接:http://lcvam.com/duotailuoji/208.html