java中构造器的调用顺序
在编程的过程中,我们经常会遇到多个类的继承问题,那么多个类的构造器是按照什么顺序调用的呢?
先看一段代码:
1 public class Meal { 2 public Meal() { 3 System.out.println("meal constructor() "); 4 } 5 } 6 7 public class Bread { 8 public Bread() { 9 System.out.println("bread constructor() "); 10 } 11 } 12 13 public class Cheese { 14 public Cheese() { 15 System.out.println("cheese constructor() "); 16 } 17 } 18 19 public class Lettuce { 20 public Lettuce() { 21 System.out.println("Lettuce constructor() "); 22 } 23 } 24 25 public class Lunch extends Meal { 26 public Lunch() { 27 System.out.println("Lunch constructor() "); 28 } 29 } 30 31 public class PortableLunch extends Lunch { 32 public PortableLunch() { 33 System.out.println("PortableLunch constructor() "); 34 } 35 } 36 37 public class Sandwich extends PortableLunch{ 38 private Bread bread=new Bread(); 39 private Cheese cheese = new Cheese(); 40 private Lettuce lettuce= new Lettuce(); 41 public Sandwich(){ 42 System.out.println("Sandwich constructor() "); 43 } 44 45 public static void main(String[] args) { 46 new Sandwich(); 47 } 48 }
上面一段代码显示多个类之间的关系:
每个类都有自己的初始化方法。
下面为打印输出的内容:
1 meal constructor() 2 Lunch constructor() 3 PortableLunch constructor() 4 bread constructor() 5 cheese constructor() 6 Lettuce constructor() 7 Sandwich constructor()
构造器的调用遵循以下的顺序:
(1):调用基类构造器。这个步骤会不断地反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,等等,直到最低层的导出类。
(2):按声明顺序调用成员的初始化方法。 .
(3):调用导出类构造器的主体。(也就是文中的main方法中的内容)
这样做的最终目的:让方法中的所有成员变量都得到初始化。
构造器的调用顺序是很重要的。当进行继承时,我们已经知道基类的一切,并且可以访问基类中任何声明为public和protected的成员。这意味着在导出类中,必须假定基类的所有成员都是有效的。一种标准方法是,构造动作一经发生,那么对象所有部分的全体成员都会得到构建。然而,在构造器内部,我们必须确保所要使用的成员都已经构建完毕。为确保这一目的,唯一的办法就是首先调用基类构造器。那么在进入子类构造器时,在基类中可供我们访问的成员都已得到初始化。此外,知道构造器中的所有成员都有效也是因为,当成员对象在类内进行定义的时候,只要有可能,就应该对它们进行初始化(也就是说,通过组合方法将对象置于类内).
若遵循这一规则,那么就能保证所有基类成员以及当前对象的成员对象都被初始化了。
转载于:https://www.cnblogs.com/xiaxj/p/6806568.html
java中构造器的调用顺序相关推荐
- java中多态案例工厂类,Java中构造器内部的多态方法的行为实例分析
本文实例讲述了Java中构造器内部的多态方法的行为操作.分享给大家供大家参考,具体如下: 这篇文章主要讨论的是,若在一个构造器中调用正在构造的对象的某个动态绑定的方法时会出现的情况.在此之前,我们需要 ...
- java中没有直接调用matlab的接口函数
java中没有直接调用matlab的接口函数,在通常的情况下我们是通过借用C++作为中间过程来实现的,使用C++主要是用c与matlab的结构实现c调用matlab的功能,将这些功能函数封装成dll文 ...
- Java中对象的实例化顺序
文章目录 1 Java中对象的实例化顺序 1 Java中对象的实例化顺序 继承后的初始化顺序: 静态成员包括静态构造代码块,初始化顺序跟书写顺序有关.
- Java中命令行调用大坑
Java中命令行调用大坑 背景 我司有一个查询服务接口机,QPS大概40~50,调用方式是Java调用Shell命令行的方式,核心代码如下: Process ps = Runtime.getRunti ...
- java中parent结构_详解java中继承关系类加载顺序问题
详解java中继承关系类加载顺序问题 实例代码: /** * Created by fei on 2017/5/31. */ public class SonClass extends ParentC ...
- php中继承过来的类初始化顺序,java_图文详解Java中class的初始化顺序,class的装载
在讲class的初始化 - phpStudy...
图文详解Java中class的初始化顺序 class的装载 在讲class的初始化之前,我们来讲解下class的装载顺序. 以下摘自<Thinking in Java 4> 由于Java ...
- JAVA中方法的调用(详细整理)
JAVA中方法的调用主要有以下几种: 1.非静态方法 非静态方法就是没有 static 修饰的方法,对于非静态方法的调用,是通过对 象来调用的,表现形式如下. 对象名.方法() eg: public ...
- java static getclass_如何从Java中的静态方法调用getClass()?
如何从Java中的静态方法调用getClass()? 我有一个必须有一些静态方法的类. 在这些静态方法中,我需要调用方法getClass()来进行以下调用: public static void st ...
- JAVA中方法的调用
JAVA中方法的调用主要有以下几种: 1.非静态方法 非静态方法就是没有 static 修饰的方法,对于非静态方法的调用,是通过对 象来调用的,表现形式如下. 对象名.方法() eg: public ...
- java构造器调用构造器_java中构造器内部调用构造器实例详解
可能为一个类写了多个构造器,有时可能想在一个构造器里面调用另外一个构造器,为了减少代码的重复,可用this关键字做到这一点. public class Flower { private String ...
最新文章
- JavaWeb实现分页的四种方法
- 清华大学:2021元宇宙发展研究报告
- ubuntu c/c++ IDE编程环境
- 【攻防世界009】流浪者
- SAP 财务模块 FI-TV 差旅管理
- Python中的负索引是什么?
- tensorflow随笔-新的计算图
- 常用的方法论-鱼骨图
- threadsafe_Agrona的Threadsafe堆缓冲区
- 如何使柱状图左右展示_Excel多次层柱状图,让数据展示更清晰,简单五步就完成...
- emf建模要小心连线循环指向的问题
- 互联网开发人员压力到底有多大?
- VisualSVN-Server 安装以及使用教程
- dts双轨制会员积分系统
- shiny app制作基本思路
- DELL G3 3590 重装win10后,显卡不识别,喇叭x号没声解决办法
- 电动车结构及其工作原理
- 【Cartopy】1.库的安装和使用
- 响应式网页设计之JavaScript基础
- 【VCU】详解S19文件(S-record)
热门文章
- c++之友元函数和友元类
- mongodb查询分页优化(二)
- 重磅!Apache Flink 1.11 功能前瞻来啦
- 关于直播,所有的技术细节都在这里了(二)
- 鸿蒙会像IOS,你更看好鸿蒙还是苹果?iOS系统升级 分享与互联成苹果发布会主题...
- pb数据窗口显示图片_AkShare股票数据A股市净率
- java切割文件出现1k_java实现把一个大文件切割成N个固定大小的文件
- java kaptcha_kaptcha Java验证码
- Python让繁琐工作自动化——chapter16 发送电子邮件和短信
- sparksql 保存点_Spark SQL笔记整理(三):加载保存功能与Spark SQL函数