java 中构造器的调用顺序

深入理解Java构造器调用机制 Java构造器是一种特殊的方法,它在创建对象时被系统自动调用。它主要用于初始化对象的状态,包括成员变量。构造器与类同名,且没有返回类型,包括void。工厂方法是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,创建对象的责任被委托给一个专门的工厂类,而不是在构造器中直接创建。这种方式可以提高系统的灵活性和可扩展性。 阅读详情

构造器的调用顺序:

step1: 调用基类构造器,首先是根,然后是下一层的导出类,直至最底层的导出类。

step2:按声明顺序调用成员的初始化方法。

step3:调用导出类构造器的主体。

还是用代码说明吧:

/**
 * 构造器的调用顺序
 */
package sandwich;
import static org.print.Print.*;//自己写的print包

class Meal {
Meal() { print("Meal()"); }
}

class Bread {
Bread() { print("Bread()"); }
}

class Cheese {
Cheese() { print("Cheese()"); }
}

class Lettuce {
Lettuce() { print("Lettuce()"); }
}

class Pickle{
	Pickle(){print("Pickle()");}
}
class Lunch extends Meal {
Lunch() { print("Lunch()"); }
}

class PortableLunch extends Lunch {
PortableLunch() { print("PortableLunch()");}
}

public class Sandwich extends PortableLunch {
private Bread b = new Bread();
private Cheese c = new Cheese();
private Lettuce l = new Lettuce();
public Sandwich() { print("Sandwich()"); }
public static void main(String[] args) {
 new Sandwich();
}
private Pickle p=new Pickle();
} 
上述代码的运行结果:

Meal()
Lunch()
PortableLunch()
Bread()
Cheese()
Lettuce()
Pickle()
Sandwich()

然鹅,当在构造器中创建了一个对象,但是该对象的所属的类是导出类。 因为在初始化对象,调用对象的构造器的时候,导出类并没有初始化。 。。。

还是用代码说明吧:

class Glyph {
  void draw() { System.out.println("Glyph.draw()"); }
  Glyph() {
     System.out.println("Glyph() before draw()");
    draw();
     System.out.println("Glyph() after draw()");
  }
}	

class RoundGlyph extends Glyph {
  private int radius = 1;  //radius 是1 !
  RoundGlyph(int r) {
    radius = r;
     System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
  }
  void draw() {
     System.out.println("RoundGlyph.draw(), radius = " + radius);
  }
}	

public class PolyConstructors {
  public static void main(String[] args) {
    new RoundGlyph(5);
  }
}
运行结果:

Glyph() before draw()
RoundGlyph.draw(), radius = 0   //         radius是0!
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5


so, RoundGlyph.draw() 覆盖了Glyph().draw() 的方法,但是,基类构造器在导出类构造器调用之前调用,所以此时radius 的值为0;


也就是说,完整的实例化的实际过程应该是:

1,在其他任何事物发生以前,将分配给对象的存储空间初始化为二进制的0;

2,如之前所述的那样,调用基类构造器。(第二个代码中,)

3,按照声明的顺序调用成员的初始化方法。调用覆盖后的draw()方法,但是RoundGlyph并未调用,radius 值为0;

4,调用导出类的构造器主体。

ZYNQ学习:PL端DDR3 读写测试 DDR SDRAM 的最大特点是双沿触发,即在时钟的上升沿和下降沿都能进行数据采集和发送,同样的工作时钟, DDR SDRAM 的读写速度可以比传统的 SDRAM 快一倍。本次实验使用的 DDR3 芯片是南亚的 NT5CC256M16ER-EKI, NT5CC256M16ER-EKI 的 bank 位宽为 3,行位宽为 15,列位宽为 10,所以它的地址大小等于 2^3*2^15*2^10(即 2^28=256M),数据位宽为 16bit,所以容量大小为 256M*16bit,也就是 512MByte。 阅读详情

相关推荐

ndnSIM学习笔记(一)

在接下来的一段时间要用ndnSIM来做自己的仿真网络,需要系统的学习相关内容,以下为内容记录。1.安装      1.1核心依赖(必需的)             • python >= 2.6             • libsqlite3             • libcrypto++             • pkg-config             • Boost lib...

gaonjzzz的博客 2985

Java对象初始化过程 代码块与构造器调用顺序

Java对象初始化过程 代码块与构造器调用顺序

RichardGeek的博客 1180

Colmap参数调优实战:如何通过5个关键设置提升3D重建精度

本文深入探讨Colmap参数调优实战,通过5个关键设置显著提升3D重建精度。重点解析特征匹配参数、BA优化配置、初始化策略、资源分配及动态调整方法,结合量化数据和实际案例,帮助开发者精准优化重建流程,适用于古建筑扫描、无人机航拍等多种场景。

weixin_30872157的博客 432

java调用构造方法先后顺序的分析

调用构造方法 在Java中,我们可以使用this调用本类的构造方法,使用super可以调用父类的构造方法,在我们的实际编程过程中,可能在相关的父类和子类中,既用到了this也用到了super,纳闷他们的调用顺序是怎样的,我们先展示程序。 public class test2{ public static void main(String[] args){ student s=new student(); s=new student("zhangsna",02,83); }} class person{

weixin_52450702的博客 1528

内网CentOS离线部署LibreOffice:从依赖缺失到服务启动的完整避坑指南

本文详细介绍了在CentOS内网环境中离线部署LibreOffice的完整流程,包括依赖包准备、安装顺序优化及常见报错解决方案。针对金融等封闭网络场景,提供从rpm包选择到服务启动的全套避坑指南,特别解决libXinerama等图形库缺失问题,确保文档转换服务稳定运行。

weixin_33416697的博客 246

Neurocomputing 投稿指南

Generation Information:选择论文所属领域。上传附件(利益声明,手稿,摘要)审稿人偏好:可以选择期待的审稿人。

qq_41174671的博客 2万+

Java中的构造器

构造器是一种特殊的方法,它与类同名,没有返回类型(甚至不写void),用于初始化对象。构造器在对象创建时由Java虚拟机(JVM)自动调用,确保对象的初始状态。构造器是Java中用于创建和初始化对象的重要方法。通过构造器,可以确保对象在创建时有一个有效的初始状态。理解构造器的工作原理、类型及其重载用法,有助于编写更灵活、可维护的代码。在实际开发中,合理使用构造器,能够提升代码的清晰度和可读性。

muxiuyulin871的博客 4866

Mplus—随机截距交叉滞后模型(RI-CLPM)语法

随机截距交叉滞后模型RI-CLPM的Mplus语法。

m0_54401011的博客 2531

java 构造器的调用顺序

1、调用基类构造器 2、按声明顺序调用成员的初始化方法 3、调用导出类构造器的主体

chen_657164的专栏 283

CMMI AIM 人工智能成熟度框架:31个过程域的157项AI实践集成

CMMI AIM人工智能成熟度框架为企业提供了系统化管理AI项目全生命周期的解决方案,包含31个过程域的157项AI实践。该框架通过四个演进阶段(混沌与风险、结构与凝聚、验证与信任、价值与增长),帮助组织建立可持续的AI能力成长路径,降低项目失败率并提升商业价值。

weixin_42613501的博客 352

Dify框架面试内容整理-如何进行Dify的二次开发?

无论是轻量修改界面,还是深度集成自定义模型、Agent、知识库,你都可以很方便地进行二次开发。,你可以基于它的开源架构对功能进行扩展、集成第三方服务、修改界面风格,甚至定制新的AI工作流程。前端:Node.js >= 16,React + TypeScript + Tailwind。接入自己的模型API(如:调用LLaMA、Baichuan、ChatGLM)。修改路径:/api/app/services/providers/可接入你自己的向量数据库(Qdrant、Milvus、FAISS)

不务正业的猿 2003

Java在继承中构造器的调用顺序

Java中子类继承父类时代码结构初始化以及调用的顺序:    子类声明一个对象时,     步骤1: 这时先调用的是基类的静态初始化块,然后是下一层的子类,一直到声明对象的类的静态初始化块。从这里就开始内存分配与初始化了。先有类才有对象。     步骤2:new Wolf(5.6) 这句话先调用的是Wolf的构造函数,但是它并没有执行,而是去调用父类的构造函数,一层层往上,直到基类,这就像栈

羊羊羊 3843

060、模型蒸馏:把扩散模型压进单步的魔法

《端侧文生图模型蒸馏实战:从32步到1步的优化之道》摘要:针对边缘设备部署难题,本文分享了扩散模型蒸馏的核心经验。通过重构损失函数(感知损失+对抗训练+KL散度)、优化采样轨迹截取策略和改造学生模型架构,成功将Stable Diffusion压缩至单步推理。关键发现包括:小批量训练更有效、标签平滑保障生成多样性、双模型策略平衡质量与速度。在Cortex-A53芯片上实现300ms内生成,内存占用控制在200MB以下。特别强调工业部署需权衡压缩率与稳定性,建议保留迭代模式开关以适配不同场景需求。

2601_95651806的博客 150

JAVA构造器调用顺序

参考:On Java 8 基类构造器被调用。这个步骤重复递归,直到根基类的构造器被调用,然后是它的派生类,以此类推,直到最底层的派生类构造器被调用。 按声明顺序初始化成员。 最终调用派生类的构造器。 例子: // polymorphism/Sandwich.java // Order of constructor calls // {java polymorphism.Sandwich} pa...

linyue1qaz的博客 249

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java构造器调用顺序

前言 今天在看书的时候,看到了关于继承的知识,突然觉得之前的理解还是不够,就想着把学到的关于构造器的知识记录下来 概念 相信大部分人都知道java里边的构造器在做一件什么样的事———创建实例对象时进行初始化,比如 public class Test { private String name; private int age; public boolean is...

丘比特爱神的博客 360

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java构造器调用构造器_java中构造器的调用顺序

在编程的过程中,我们经常会遇到多个类的继承问题,那么多个类的构造器是按照什么顺序调用的呢?先看一段代码:1 public classMeal {2 publicMeal() {3 System.out.println("meal constructor() ");4 }5 }67 public classBread {8 publicBread() {9 ...

weixin_30975527的博客 602

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java 继承与多态(三)—构造器的调用顺序

构造器是java为我们提供的一个初始化的地方。所以它与我们自己定义的普通方法有着一些特殊之处。当你遇到了复杂的对象的构建过程时,构造器的初始化顺序就变的极为重要了。以下一段代码为大家展示,多层继承与组合所构成的负责类构造器的调用顺序。package test;import edu.princeton.cs.algs4.StdOut;class Meal{ Meal() { S

devY的博客 929

【java in think】构造器的调用顺序

class Meal { public Meal() { System.out.println("Meal()--构造啦!"); } } class Bread { public Bread() { System.out.println("Bread()--构造啦!"); ...

adv95196的博客 140

Java 基类与子类构造器调用顺序

1、基类构造器总是被调用的 2、基类构造器在子类调用前被调用 3、调用基类构造器是子类构造器必须做的第一步。 package com.test.d7.x2; public class Cartoon extends Drawing { Cartoon() { System.out.println("Cartoon constructor"); } p...

xiaolongwu8666的专栏 405

Java基础之构造器调用顺序

构造器调用顺序说明 调用基类(父类)构造器,这个步骤不断反复递归下去,首先是构造这种层次的根,然后是下一个导出类(子类),直到最底层导出类 按声明顺序调用成员的初始化方法 调用导出类构造器的主体(当前main方法所在类构造器) 代码示例package eight;import sevenChapter.Chess;/** * 构造器的调用顺序 * @author SLH * @date 20

技术小青年一枚 387

[Java] 类中构造器的调用顺序

在产生一个类的对象的时候,直观上应该最先直接调用一个类的构造器,然后再生成其他的一些东西,然后事实并非如此: 且看下面这段程序: 我创建了一个Root类,令其中含有名为Component1,2,3的类的一个实例,从Root中派生一个类Stem,也含有上述的各组成部分,所有的类都带有可以打印出相关信息的默认构造器,以此来观察: package exercise7; public clas

特里斯坦的 C 大调狂想曲 562

java构造器的调用顺序

原文 /** * 构造器的调用顺序 * 子类在产生对象实例时首先会调用父类的构造函数,如果没有显示指定调用父类自定义的构造函数, * 那么编译器会默认调用super()。如果父类的构造函数中带参数,就必须在子类中指定调用它,否则 * 会因找不到super而报错。 */ class Animal{ Animal(){ System.out.printl

小嘞嘞的专栏 331

Java构造器的调用顺序

构造器的调用顺序 基类的构造器总是在子类的构造过程中被调用,而且按照继承层次逐渐向上连接,所以每个基类的构造器都能得到调用。  这是为什么呢? 构造器的一项任务就是检查对象是否被正确构造.子类只能访问自己的成员,不能访问基类的成员(基类成员大多数是private类型)。只有基类的构造器才能具有恰当的知识和权限来对自己的元素进行初始化。因此必须令所有构造器都得到调用,否则就不可能正确的构造完整对象

Brin 1373

Java构造器的调用顺序和多形性

在读到《Java编程思想》一文中的构造器部分时,觉得有几个知识点印象深刻,故在此记录一下,仅当随笔。一、构造器的调用顺序在深层继承的复杂对象中,构建器的调用顺序到底是怎样的呢。首先,我们知道衍生类(子类)在继承基础类(父类)时可以访问基础类的任何public 和 protected 成员。这意味着在使用衍生类的时候,必须能假定基础类的所有成员都是有效的。为达到这个要求,唯一的办法就是首先调用基础类...

浪迹白杨的博客 422

Java 类构造器调用和成员初始化顺序

调用基类构造器。首先构造继承关系最上层类的构造器,然后是下一层导出类的构造器,以此类推,直至最底层的导出类。 按声明顺序调用成员的初始化方法。 调用导出类构造器的主体。 demo class A { public A() { System.out.println("A()"); } } class B { public B() { ...

leo的小作坊 546

Java中调用构造器初始化执行顺序

调用构造器初始化执行顺序: 第一步:静态初始化语句、静态初始化块 按顺序依次执行。 第二步:非静态初始化语句、非静态初始化块 按顺序依次执行。 第三步:执行构造器方法。 要是在加载静态部分时,通过new调用构造器,将会先暂停加载后面的静态部分,而去执行实例化。 静态部分只有在类第一次加载的时候,才会执行。之后再加载将不再执行。 示例: public class Test1 { pub...

handsome-h的博客 872
上一篇: java 中equals 和==
下一篇: 使用 引用计数 来跟踪访问共享对象的对象数量
技术搬运工
博客等级 码龄11年 3粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值