在编程的过程中,我们经常会遇到多个类的继承问题,那么多个类的构造器是按照什么顺序调用的呢?

先看一段代码:

 public class Meal {
public Meal() {
System.out.println("meal constructor() ");
}
} public class Bread {
public Bread() {
System.out.println("bread constructor() ");
}
} public class Cheese {
public Cheese() {
System.out.println("cheese constructor() ");
}
} public class Lettuce {
public Lettuce() {
System.out.println("Lettuce constructor() ");
}
} public class Lunch extends Meal {
public Lunch() {
System.out.println("Lunch constructor() ");
}
} public class PortableLunch extends Lunch {
public PortableLunch() {
System.out.println("PortableLunch constructor() ");
}
} public class Sandwich extends PortableLunch{
private Bread bread=new Bread();
private Cheese cheese = new Cheese();
private Lettuce lettuce= new Lettuce();
public Sandwich(){
System.out.println("Sandwich constructor() ");
} public static void main(String[] args) {
new Sandwich();
}
}

上面一段代码显示多个类之间的关系:

每个类都有自己的初始化方法。

下面为打印输出的内容:

 meal constructor()
Lunch constructor()
PortableLunch constructor()
bread constructor()
cheese constructor()
Lettuce constructor()
Sandwich constructor()

构造器的调用遵循以下的顺序:

(1):调用基类构造器。这个步骤会不断地反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,等等,直到最低层的导出类。

(2):按声明顺序调用成员的初始化方法。 .
(3):调用导出类构造器的主体。(也就是文中的main方法中的内容)

这样做的最终目的:让方法中的所有成员变量都得到初始化。

构造器的调用顺序是很重要的。当进行继承时,我们已经知道基类的一切,并且可以访问基类中任何声明为public和protected的成员。这意味着在导出类中,必须假定基类的所有成员都是有效的。一种标准方法是,构造动作一经发生,那么对象所有部分的全体成员都会得到构建。然而,在构造器内部,我们必须确保所要使用的成员都已经构建完毕。为确保这一目的,唯一的办法就是首先调用基类构造器。那么在进入子类构造器时,在基类中可供我们访问的成员都已得到初始化。此外,知道构造器中的所有成员都有效也是因为,当成员对象在类内进行定义的时候,只要有可能,就应该对它们进行初始化(也就是说,通过组合方法将对象置于类内).

若遵循这一规则,那么就能保证所有基类成员以及当前对象的成员对象都被初始化了。

java中构造器的调用顺序的更多相关文章

  1. Java构造器的调用顺序

    <Java编程思想>中对构造器的调用顺序有如下描述: “构造器实际上是static方法,只不过该static声明是隐式的.” “基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次 ...

  2. Java继承中构造器的调用原理

    Java的继承是比较重要的特性,也是比较容易出错的地方,下面这个例子将展示如果父类构造器中调用被子类重写的方法时会出现的情况: 首先是父类: public class test { void fun( ...

  3. Java中的成员初始化顺序和内存分配过程

    Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...

  4. Java中是否可以调用一个类中的main方法?

    前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...

  5. UIViewController中各方法调用顺序及功能详解

    UIViewController中各方法调用顺序及功能详解 UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, ...

  6. java中的TreeMap如何顺序按照插入顺序排序

    java中的TreeMap如何顺序按照插入顺序排序 你可以使用LinkedHashMap  这个是可以记住插入顺序的. 用LinkedHashMap吧.它内部有一个链表,保持插入的顺序.迭代的时候,也 ...

  7. java 中使用ajax调用后台方法注意事项

    java 中使用ajax调用后台方法注意事项,后台方法一定要加@ResponseBody jQuery.validator.addMethod("checkRuleName",fu ...

  8. [转载]Java中异常的捕获顺序(多个catch)

    http://blog.sina.com.cn/s/blog_6b022bc60101cdbv.html [转载]Java中异常的捕获顺序(多个catch) (2012-11-05 09:47:28) ...

  9. JAVA中方法的调用主要有以下几种

    JAVA中方法的调用主要有以下几种: 1.非静态方法 非静态方法就是没有 static 修饰的方法,对于非静态方法的调用,是通过对 象来调用的,表现形式如下. 对象名.方法() eg: public ...

随机推荐

  1. Spring Cloud个组件原理

    引言 面试中面试官喜欢问组件的实现原理,尤其是常用技术,我们平时使用了SpringCloud还需要了解它的实现原理,这样不仅起到举一反三的作用,还能帮助轻松应对各种问题及有针对的进行扩展.以下是 课程 ...

  2. Javaweb之EL表达式

    1.EL表达式简介 EL全名为Expression Language.EL的主要作用为: 获取数据:EL表达式主要用于替换jsp页面中的脚本表达式,以从各种类型的web域中检索java对象,获取数据. ...

  3. 我的Java编码规范

    1.类名采用驼峰命名法,首字母大写. 2.类变量采用驼峰命名法,首字母小写. 3.方法名是一个动词短语,首字母小写,尽量能描述清楚这个方法的意图. 4.注释在精不在多,一个好的注释要尽量描述出这段代码 ...

  4. 廖雪峰JavaScript练习题2

    请把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字.输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart'] 肯定有更简单的方法, ...

  5. 解决Win7远程连接灰色无法选中的问题

    内网开发最常用的莫过于Windows的远程连接服务了.但是有时候这个远程连接是灰色的,无法勾选.折腾了各种办法.最后在这里找到了答案.https://answers.microsoft.com/en- ...

  6. create-react-app找不到配置项

    npm run eject 这个一个不可逆过程,一旦你执行了,就不能回到初始化

  7. 在URL里传入数组到HTML 里。

    需求 静态页面根据URL输入,动态显示图表满足如下两个条件. 1. 隐藏指定的行 2. 设定初始显示的Check box 需要的部分被打勾 实现 1. 创建一个静态的页面, <table id= ...

  8. Linux系统下安装Gitlab

    Linux系统下安装Gitlab 一.简介 GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与 ...

  9. js计算时间差(天,小时,分钟,秒)

    <script type="text/javascript"> var date1= '2015/05/01 00:00:00'; //开始时间 var date2 = ...

  10. RabbitMq ack 与 nack

    1.ack 移除 2.nack 移除再次发送队列