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

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

  • 相关阅读:
    石子合并之一
    最长公共子序列
    最长上升子序列
    剑圣的逃跑
    方格取数
    数字三角形
    Omkar and Last Class of Math
    IDEA中对代码进行测试
    Spark(一)【spark-3.0安装和入门】
    HTTP请求 Java API
  • 原文地址:https://www.cnblogs.com/xiaxj/p/6806568.html
Copyright © 2020-2023  润新知