Java构造函数调用顺序问题

Java构造函数调用顺序问题java构造代码调用顺序研究。

大家好,又见面了,我是你们的朋友全栈君。

今天对Java的构造函数调用顺序进行研究,使用的是与C++类似的方法,即不对源码进行研究,而是直接通过打印代码对构造函数的调用顺序进行研究。

代码如下,使用的是Java核心技术中的代码,对其进行了改造,在构造函数中加入了输出信息

public class ConstructorTest
{
   public static void main(String[] args)
   {
 Employee temp = new Employee();
   }
}

class Employee
{
   private static int nextId;
   private static int counter;

   private int id;
   private String name = ""; // instance field initialization
   private double salary;
  
   // static initialization block
   static
   {
      Random generator = new Random();
      // set nextId to a random number between 0 and 9999
      nextId = generator.nextInt(10000);
      System.out.println(" static initialization block : " + counter++);
   }

   // object initialization block
   {
      id = nextId;
      nextId++;
      System.out.println(" object initialization block : " + counter++);
   }

   // three overloaded constructors
   public Employee(String n, double s)
   {
      name = n;
      salary = s;
      System.out.println(" constructors1 : " + counter++);
   }

   public Employee(double s)
   {
      // calls the Employee(String, double) constructor
      this("Employee #" + nextId, s);
      System.out.println(" constructors2 : " + counter++);
   }

   // the default constructor
   public Employee()
   {
      // name initialized to ""--see above
      // salary not explicitly set--initialized to 0
      // id initialized in initialization block
	   System.out.println(" constructors3 : " + counter++);
   }


}

运行结果如下:

 static initialization block : 0
 object initialization block : 1
 constructors3 : 2

通过上述程序验证了:所有数据域被初始化为默认值(0,false,NULL),此处counter初始化为0。

再来看第二条规则:按照类声明中出现的次序,依次执行所有域初始化语句和初始化块。

程序运行结果显示先执行静态初始化块后执行域初始化块,可以通过调换上述两个初始化块的次序对这一规则进行验证。

这里书中的讲解并不是很清楚,静态初始化块的优先级要高于域初始化块,因此静态初始化块的执行要早于域初始化块,只有在同级别的情况下,才按照声明的顺序调用,这一点我通过将static去掉进行了验证。

代码:

// object initialization block
   {
      id = nextId;
      nextId++;
      System.out.println(" object initialization block : " + counter++);
   }
   
   // static initialization block
   {
      Random generator = new Random();
      // set nextId to a random number between 0 and 9999
      nextId = generator.nextInt(10000);
      System.out.println(" static initialization block : " + counter++);
   }

执行结果

 object initialization block : 0
 static initialization block : 1
 constructors3 : 2

构造函数最后调用,没有什么问题。

最后一点:如果构造器第一行调用了第二个构造器,则执行第二个构造器的主体。

最后还有一点非常重要的内容,构造器调用一定要是第一句,否则编译出错。在构造器中只能调用一次其他构造函数,不能调用两次,即无法再调用第三个构造函数。

本人是初学者,还无法从JVM的角度分析问题,同时回应各位大神对文中的错漏进行指出。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151088.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 时滞微分方程是什么_时滞微分方程教学大纲

    时滞微分方程是什么_时滞微分方程教学大纲考虑下面的变时滞微分方程试绘制上述含有时变时滞微分方程的图像分析:该方程应该在某个t0时间之后成立,初始值必须是定义在t0之前的一个关于t的单值向量函数phi(t)。我假设t0=0吧,phi(t)=[1;-1];matlab程序:functionddeext0=0;tfinal=5;tspan=[t0,tfinal];sol=dd

    2022年9月30日
    1
  • java多线程–同步锁、

    java多线程–同步锁、同步代码块:语法:synchronized(同步锁){     需要同步操作的代码}—————————————————同步锁:为了保证每个线程都能正常执行原子操作,Java引入了线程同步机制.同步监听对象/同步锁/同步监听器/互斥锁:对象的同步锁只是一个概念,可以想象为在对象上标记了一个锁….

    2022年6月13日
    27
  • 树莓派配置记录——aria2

    aria2是linux下的一个下载利器,支持http/BT/磁力连。本身是命令行程序,支持rpc连接,因此可以编程控制,github上有很多优秀的webUI,非常适合树莓派。aria2本身的配置选项很多,完整的列表在这里下面是我的配置,放在~/.aria2/aria2.config文件中#默认下载路径dir=/home/pi/Downloads#下载前预创建文件,ext4可…

    2022年4月7日
    120
  • XBox360自制系统的更新(Update)「建议收藏」

    XBox360自制系统的更新(Update)「建议收藏」升级了XBox360自制系统之后,还需要进一步更新系统来解决黑白人偶和无法使用Kinect的问题。

    2022年8月2日
    41
  • WSUS Troubleshooting guide「建议收藏」

    WSUS Troubleshooting guide「建议收藏」TroubleshootingguideforissueswhereWSUSclientsarenotreportingin来自于WSUSTEAMBLOGThisguideiswrittentoassistspecificallyintroubleshootingWSUSwhenclientsarenotrepor…

    2022年5月24日
    42
  • UINT16_uint16是什么数据类型

    UINT16_uint16是什么数据类型记得之前在刷笔试题的时候就看见过这个问题,发现当时上网百度后又忘了。最近在看CryEngine3引擎代码的时候又晕了,趁现在赶紧记下来~在查看CE3的代码时我发现了这个变量,TFlowNodeIdm_flowNodeId;心想这是什么鬼?(请理解一个菜鸟没啥经验)然后果断在VS下按F12查看定义,连着按了几次我终于捋清其中的奥妙。所以我干脆把uint8,uint32

    2022年9月7日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号