`
rootjo
  • 浏览: 17422 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

构造方法内部的多态方法的行为

阅读更多
序:
希望此文可给站在java起点上的J友们一点启示
在此感谢MARS,久城等朋友给我的帮助

引子:昨天在一群里看到如下一段代码,让我郁闷了一下午:
class Super{
  int i = 10;
  public Supper(){
     print();
     i = 20 ;
   }

void print(){
  System.out.println(i);
}
}
class Sub extends Supper{
  int i = 30;
  public Sub(){
    print();
    super.print();
    i = 40;
}

void print(){
  System.out.println(i);
}
}
public class TestExtends{
   public static void main(String [] args){
      new Sub();
}
}
对于这道题,我的答案是:10 30 20
可运行的结果是: 0 30 20
   看到答案让我很是费解,按照方法的调用顺序:在调用子类的构造方法之前先调用父类的构造方法,在执行构造方法的语句之前先初始化成员变量。按照这个顺序得到的应该是我预期的答案。
  在解答此问题之前,让我们先回顾一下多态的几个知识点:
多态:在运行时刻接口匹配的对象能互换的能力,即,多态使得你可以向对待父类的成员那样对待派生类的成员。简单的说:就是用基类的引用指向之类的对象
多态的三个必要条件:
1)要有继承
2)要有重写(覆盖)
3)父类引用指向子类对象
   在Java语言机制中,多态表现为后绑定(或者叫动态绑定、晚期绑定),有两种形式:继承父类并重载父类中具有相同签名的方法(即overriding或者overwriting);实现抽象父类(或接口)中具有相同签名的方法。当你对由父类声明的对象调用该方法时,对应的子类中的方法就会被调用。即运行时会根据对象类型找覆盖之后的方法;
    一般的方法内部,动态绑定的调用是在运行时才决定的,因为对象无法知道它是属于方法所在的那个类,还是属于那个类的子类。
  如果要调用构造方法内部的一个动态绑定方法,就要用到那个方法的被覆盖后的定义。然而这个调用的效果可能相当难以预料,因此被覆盖的方法在对象被完全构造之前就会被调用
  从概念上讲,构造方法的工作实际上是创建对象。在任何构造方法内部,整个对象可能只是部分形成--我们知道基类已经进行初始化。如果构造方法只是在构建对象过程中的一个步骤,并该对象所属于的类是从构造方法所属的类导出的,那么导出部分在当前构造方法被调用的时刻仍旧是没有被初始化的。然而,一个动态绑定的方法调用却会向外深入到继承层次结构内部,它可以调用子类里的方法。如果我们是在构造方法内部这样做,那么就可能会调用某个方法,而这个方法所操纵的成员可能还未进行初始化。
论证:
class Glyph{
void draw(){ print("Glyph.draw()");}
Glyph(){
  print("Glyph() before draw()");
  draw();
  print("Glyph() before draw()");
}

public static void print(String s){
  System.out.println(s);
}
}
class RoundGlyph extends Glyph{
private int radius = 1;
RoundGlyph(int r){
  radius = r;
  print("RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw(){
  print("RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors{
public static void main(String[] args){
  new RoundGlyph(5);
}
}
输出结果:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() before draw()
RoundGlyph.RoundGlyph(), radius = 5
说明:Glyph.draw()方法设计为将要被覆盖,这种覆盖是在RoundGlyph中发生的。但是Glyph构造方法会调用这个方法,结果导致了对RoundGlyph.,draw()的调用,这看起来似乎是我们的目的。但是如果看输出结果,我们会发现当Glyph的构造方法调用draw()方法时,radius不是默认初始值1,而是0。
揭秘:初始化的实际过程:
1)在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。
2)调用基类构造方法。此时,被覆盖后的draw()方法(要在调用RoundGlyph构造方法之前调用),由于步骤1的缘故,我们此时会发现radius的值为0.
3)按照声明的顺序调用成员的初始化方法。
4)调用子类的构造方法主体
这样做的优点是什么呢?那就是所有东西都至少初始化为零(或者是某些特殊数据类型中与“零”等价的值)而不是仅仅留作垃圾。其中包括通过组合而嵌入一个类内部的对象引用其值是null。
  到这里,也就明白了开头那道问题的输出,调用Sub的时候先调用其构造方法。由于Sub继承了Super,所以又调用Super的构造方法,而print方法被重写了,调用Sub的print方法,这时候Sub还没有加载,i还没被赋值,所以输出默认值0。

分享到:
评论

相关推荐

    PINN python代码

    PINN python代码

    jellyfin-10.10.6-windows-x64

    jellyfin_10.10.6_windows-x64

    自动填写调查问卷-python程序

    python实现自动填写调查问卷

    Apache Tomcat的安装及配置详细教程

    Apache Tomcat的安装及配置详细教程

    基于改进LDW-PSO算法的交直流电网运行经济型优化策略:计及分时电价与VSC传输特性的损耗成本优化研究,基于改进LDW-PSO算法的交直流电网运行经济型优化策略:计及分时电价与VSC传输特性的损耗成

    基于改进LDW_PSO算法的交直流电网运行经济型优化策略:计及分时电价与VSC传输特性的损耗成本优化研究,基于改进LDW_PSO算法的交直流电网运行经济型优化策略:计及分时电价与VSC传输特性的损耗成本优化研究,交直流电网运行经济型优化,基于改进LDW_PSO优化算法求解交直流电网时序最小运行损耗成本。 优化目标:计及分时电价情况下,含多端口SOP(VSC)的交直流电网时序运行损耗成本。 (可根据需求修改) 优化对象:各端口VSC传输功率大小 优化算法:改进LDW_PSO(可设优化算法对比) 考虑因素:各子系统的DG和负荷的波动,VSC损耗 ,核心关键词:交直流电网;运行经济型优化;改进LDW_PSO;时序最小运行损耗成本;分时电价;多端口SOP(VSC);传输功率大小;各子系统DG和负荷波动;VSC损耗。,基于改进LDW_PSO算法的交直流电网运行经济性优化

    Swufe-seminar,用来制作西南财经大学风格的Seminar汇报PPT。依托deepseek.zip

    deepseek应用

    离线辨识参数结合EKF算法实现高精度电池SOC估计的Simulink建模与仿真,Simulink环境下基于离线辨识参数和EKF扩展卡尔曼滤波算法的电池SOC高精度估算模型,离线辨识参数+EKF扩展卡尔

    离线辨识参数结合EKF算法实现高精度电池SOC估计的Simulink建模与仿真,Simulink环境下基于离线辨识参数和EKF扩展卡尔曼滤波算法的电池SOC高精度估算模型,离线辨识参数+EKF扩展卡尔曼滤波算法做电池SOC估计,在Simulink环境下对电池进行建模,包括: 1.电池模型 2.电流测量噪声下 采用simulink编写电池模型、EKF扩展卡尔曼滤波算法,在Simulink模型运行时计算SOC,通过仿真结果可以看出,估算的精度很高 ,离线辨识参数; EKF扩展卡尔曼滤波算法; 电池SOC估计; Simulink建模; 电池模型; 电流测量噪声; 高精度估算。,Simulink中基于EKF算法的离线电池SOC精确估计模型

    网络流量嗅探器(网络攻防作业).zip(课设&实训&大作业&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用

    二阶锥规划在主动配电网动态最优潮流求解中的应用实践与代码详解,基于二阶锥优化的主动配电网动态最优潮流求解方法与实现详解(含风电等设备的配电网优化应用),基于二阶锥规划的主动配电网动态最优潮流求解 关键

    二阶锥规划在主动配电网动态最优潮流求解中的应用实践与代码详解,基于二阶锥优化的主动配电网动态最优潮流求解方法与实现详解(含风电等设备的配电网优化应用),基于二阶锥规划的主动配电网动态最优潮流求解 关键词:配电网优化 二阶锥优化 动态优化 最优潮流 仿真代码:MATLAB YALMIP+CPLEX 优势:代码注释详实,适合参考学习,全程有讲解 主要内容:代码主要主要研究的配电网优化,具体为配电网中的最优潮流优化,考虑了风电、CB、SVG以及OLTC等设备,更加具有代表性,同时潮流的求解方法采用二阶锥方法,构建了SOCP模型,求解效率大大增加,代码提供讲解视频。 参考:主动配电网最优潮流研究及其应用实例--仅参考部分模型 目标函数:子配电网向主网购电量 + 子配电网有功损耗 ,关键词:二阶锥规划; 主动配电网; 动态最优潮流; 配电网优化; 最优潮流求解; 风电; CB; SVG; OLTC设备; 视频讲解。,基于二阶锥优化的主动配电网动态最优潮流MATLAB求解:考虑多种设备模型的高效计算实践

    EPPlus V4.5.3.1 库文件 6.1.1

    epplus

    一款免费开源、电脑C盘空间清理等功能强大的系统维护工具的工具-Dism++

    Dism++是一款基于Windows底层 CBS(Component Based Servicing) 开发的系统管理工具,提供图形化界面(GUI),无需依赖微软自带的DISM命令行工具即可实现更底层的系统操作。它由初雨团队开发,以免费开源、无广告、轻量级为核心特点,支持Windows Vista至Windows 11全版本系统。无论是系统优化、垃圾清理,还是映像编辑、驱动管理,Dism++都能轻松胜任,被誉为“装机必备神器”。

    MATLAB程序:新能源接入电力市场主辅联合出清模型-基于IEEE30节点系统SCUC与SCED协同优化分析的实践案例,基于MATLAB的新能源接入电力市场主辅联合出清模型:考虑安全约束与经济调度的

    MATLAB程序:新能源接入电力市场主辅联合出清模型——基于IEEE30节点系统SCUC与SCED协同优化分析的实践案例,基于MATLAB的新能源接入电力市场主辅联合出清模型:考虑安全约束与经济调度的IEEE 30节点风电机组调度,MATLAB代码:新能源接入的电力市场主辅联合出清 出清模型以考虑安全约束的机组组合模型(SCUC)和经济调度模型(SCED)组成。 程序基于IEEE30节点编写,并接入风电机组参与电力市场,辅助服务市场为备用市场。 出清后可得多种结果,包括机组计划,风机出力,线路功率等(详细见图)。 该程序结果正确,注释齐全,开发空间较大 运行前请确保安装yalmip和cplex gurobi等优化求解器。 ,新能源接入; 电力市场主辅联合出清; SCUC; SCED; 风电机组参与; 备用市场; 优化求解器,MATLAB程序:新能源接入下的电力市场主辅联合出清系统(SCUC与SCED模型)

    基于Matlab的FFT分析与滤波程序:快速频谱分析、谐波识别及信号提取,直观导入数据,附带详细注释与Simulink集成,基于Matlab的FFT分析与滤波程序:快速频谱分析、谐波识别及特定频率波形

    基于Matlab的FFT分析与滤波程序:快速频谱分析、谐波识别及信号提取,直观导入数据,附带详细注释与Simulink集成,基于Matlab的FFT分析与滤波程序:快速频谱分析、谐波识别及特定频率波形提取工具,附详细注释与Simulink支持,可视化对比图展示,基于matlab的FFT分析和滤波程序,可对数据信号进行频谱分析,分析波形中所含谐波分量,并可以对特定频率波形进行提取。 不需要通过示波器观察,直接导入数据即可,快捷便利。 程序带有详细注释,不理解之处可提供解答。 也可将数据导入simulink进行分析。 图a为原始信号,图b为原始信号FFT分析结果,图c为提取 50Hz基波信号的结果对比,图d为滤波后的FFT分析结果,效果非常好 ,基于Matlab的FFT分析; 滤波程序; 谐波分量分析; 特定频率波形提取; 详细注释; Simulink分析; 原始信号处理; FFT分析结果; 基波信号提取; 滤波效果。,基于Matlab的信号频谱分析与滤波程序——谐波提取与高效滤波工具

    “多时间尺度下的微网优化调度策略:考虑需求响应与日内滚动优化”,基于多时间尺度与需求响应机制的微网优化调度策略:多能源系统协同调控,日内滚动优化降低运维成本,右关键词:多时间尺度;模型预测控制;日

    “多时间尺度下的微网优化调度策略:考虑需求响应与日内滚动优化”,基于多时间尺度与需求响应机制的微网优化调度策略:多能源系统协同调控,日内滚动优化降低运维成本,[右]关键词:多时间尺度;模型预测控制;日内滚动优化;微网,需求响应 [右]描述:以包含风力场、光伏电站、微型燃气轮机、蓄电池、余热锅炉、热泵、储热罐和电 热负荷的多能源微网系统为研究对象,构建了各微源的数学模型。 然后,提出一种多时间尺度下考虑负荷需求响应机制的微网优化调度策略。 在日前阶段,以源-荷日前预测数据和分时电价数据为基础,利用价格型需求响应机制引导用户积极参与负荷调整,从而平滑了负荷曲线,减小了系统调峰压力,在此基础上,以微网运维成本、购电成本、购气成本和污染物排放惩罚成本之和最小为优化目标建立了日前优化调度模型;在日内阶段,为了进一步提高调度精度,以各分布式电源日内-日前功率方差最小为目标函数,建立微网日内滚动优化调度模型。 最后,利用YALMIP调用Cplex求解器对日前-日内双级调度模型进行求解,得到日前和日内不同阶段下各分布式电源的最优功率曲线以及运行成本值。 ,多时间尺度; 模型预测控制; 日前优化调度模型

    基于MATLAB的深度学习时间序列回归预测:RNNs模型(LSTM、GRU、biLSTM)的多步预测及误差指标计算实例,基于MATLAB的深度学习时间序列回归预测:使用RNNs模型(LSTM、GRU及

    基于MATLAB的深度学习时间序列回归预测:RNNs模型(LSTM、GRU、biLSTM)的多步预测及误差指标计算实例,基于MATLAB的深度学习时间序列回归预测:使用RNNs模型(LSTM、GRU及biLSTM)的多步预测及误差指标计算,深度学习时间序列回归预测,基于MATLAB。 RNNs模型,包括长短期记忆(LSTM),门限循环单元(GRU)和双向长短期记忆(biLSTM)。 有实例,替数据即可直接运行。 有训练集和测试集划分,输出预测结果的同时计算测试集上的误差指标,如RMSE,MAPE。 可以进行多步预测。 ,深度学习;时间序列回归预测;MATLAB;RNNs模型;长短期记忆LSTM;门限循环单元GRU;双向长短期记忆biLSTM;训练集和测试集划分;多步预测;误差指标RMSE、MAPE,基于MATLAB的深度学习时间序列回归预测:RNNs模型与误差指标分析

    帝国cms仿花生日记小说阅读网小说公众号引流源码+火车头采集

    今天来分享一款帝国cms仿花生日记小说阅读网的源码支持小说引流到公众号源码; 源码特点:用户阅读一章小说后必须关注公众号才能继续阅读小说 花生日记小说帝国CMS精仿版,无域名限制,全站开源; 帝国小说系统(EmpireBook )基于V7.5内核构建 仿花生日记小说阅读网模版源码目录页如下: 阅读页功能还不错,支持微信公众号引导关注,大概引导方案是这样的: 用户搜到自己想看的小说点击阅读但是只能阅读一章,或者一部分介绍然后必须关注微信号才能继续阅读小说; 非常不错的小说微信公众号引流系统、小说引流到公众号源码; 总之一句话:用户阅读一半小说然后关注微信公众号继续阅读,带来不菲的关注量然后变现; 带手机版,带采集,小说引流到公众号源码分销模式赚钱; 安装说明: 1:上传源码。访问 http://你的域名/e/install 2:安装后登陆后台还原数据库 3:还原数据库后的管理和密码为 admin admin888 后台生成全部即可

Global site tag (gtag.js) - Google Analytics