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

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

时间: 2024-10-12 09:22:54

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

引入多态后构造器的调用顺序

前言 基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用.这样做是有意义的,因为构造器具有一项特殊任务:检查对象是否被正确的构造.导出类只能访问它自己的成员,不能访问基类中的成员(基类成员通常是private类型).只有基类的构造器才具有恰当的知识和权限来对自己的元素进行初始化.因此,必须令所有构造器都得到调用,否则就不可能正确构造完整对象.这正是编译器为什么要强制每个导出类部分都必须调用构造器的原因.在导出类的构造器主体中,如果没有明确指

java中 构造器与void

在java中,构造器与void都没有返回值, java编程思想中这么解释构造器的: 构建器属于一种较特殊的方法类型,因为它没有返回值.这与 void 返回值存在着明显的区别.对于void 返回值,尽管方法本身不会自动返回什么,但仍然可以让它返回另一些东西.构建器则不同,它不仅什么也不会自动返回,而且根本不能有任何选择.若存在一个返回值,而且假设我们可以自行选择返回内容,那么编译器多少要知道如何对那个返回值作什么样的处理. 自己运行的例子: public class SimpleConstruct

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

http://blog.sina.com.cn/s/blog_6b022bc60101cdbv.html [转载]Java中异常的捕获顺序(多个catch) (2012-11-05 09:47:28) 转载▼ 标签: 转载 分类: 转载 原文地址:Java中异常的捕获顺序(多个catch)作者:leesa Java代码 import java.io.IOException; public class ExceptionTryCatchTest { public void doSomething(

Java中 初始化的先后顺序?

我们在java中 Java中初始化的顺寻? java代码: package sru.love.c; class Person { String name = "Person"; static { System.out.println("我是 Person 的 static 代码块"); } { System.out.println("我是 Person 构造代码块"); } Person() { System.out.println("

Java中使用HttpRequest调用RESTfull的DELETE方法接口提示:How to fix HTTP method DELETE doesn't support output

说明:无论是Spring框架还是Spring Boot的Feign形式的客户端,以下的解决方法都适用. 解决方法:直接升级JDK 1.8,这个问题是1.7的BUG. 参考: https://salesforce.stackexchange.com/questions/34624/http-method-delete-doesnt-support-output https://salesforce.stackexchange.com/questions/66097/how-to-fix-http-

java中构造器(Constructor)

构造器是一个创建对象时被自动调用的特殊方法,为的是初始化.构造器的名称应与类的名称一致. 当创建一个个对象时,系统会该对象的属性默认初始化,基本类型属性的值为0(数值类型),false(布尔类型),把所有的引用类型设置为null. 构造器可以改变这种默认的初始化. 构造器的作用:是创建Java对象的重要途径,是不是说构造器完全负责创建java对象? 答:是创建java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回了该类的对象,但这个对象并不是完全由构造器负责创建的. 首先要注意的

java中构造器(Constructor)

大部分内容转自:http://tech.it168.com/j/2006-05-18/200605181021879.shtml 构造器是一个创建对象时被自动调用的特殊方法,为的是初始化.构造器的名称应与类的名称一致. 当创建一个个对象时,系统会该对象的属性默认初始化,基本类型属性的值为0(数值类型),false(布尔类型),把所有的引用类型设置为null. 构造器可以改变这种默认的初始化. 构造器的作用:是创建java对象的重要途径,是不是说构造器完全负责创建java对象? 答:是创建java

再次认识Java中构造器的初始化与继承

class Insect { private int i = 9; protected static int j; Insect() { Print.print("i = " + i + ",j = " + j); j = 39; } private static int x1 = printInit("static Insect.x1 初始化"); static int printInit(String s) { Print.print(s);

JAVA中构造器和方法的区别点

要学习Java,你必须理解构造器.因为构造器可以提供许多特殊的方法,这个对于初学者经常混淆.但是,构造器和方法又有很多重要的区别. 下面将简单介绍一下 ,最后用一个表作了些简单的总结. 功能和作用的不同构造器是为了创建一个类的实例.这个过程也可以在创建一个对象的时候用到:Platypus p1 = new Platypus(); 相反,方法的作用是为了执行java代码. 修饰符,返回值和命名的不同构造器和方法在下面三个方便的区别:修饰符,返回值,命名.和方法一样,构造器可以有任何访问的修饰: p