java构造函数顺序,java构造函数顺序

本文探讨了Java中构造器与实例初始化块的执行顺序,解释了为何在创建对象时,程序会先调用带参数的构造器,再执行初始化块。这可能导致理解上的困惑,但这是由于子类构造器必须先调用超类构造器,然后才能进行自身的初始化。作者建议避免使用实例初始化块,因为它们不如构造器常见,功能有限且可能导致混淆。
摘要由CSDN通过智能技术生成

This java program is easy and full of comment,so you can understand it fast.however,why in construct staff[1],the program first go to the statement:

this("Employee #" + nextId, s);

then go to the object initialization block,and then go back to the statement,how confusion.why not it first use the object initialization block

import java.util.*;

public class ConstructorTest

{

public static void main(String[] args)

{

// fill the staff array with three Employee objects

Employee[] staff = new Employee[3];

staff[0] = new Employee("Harry", 40000);

staff[1] = new Employee(60000);

staff[2] = new Employee();

// print out information about all Employee objects

for (Employee e : staff)

System.out.println("name=" + e.getName()

+ ",id=" + e.getId()

+ ",salary=" + e.getSalary());

}

}

class Employee

{

// three overloaded constructors

public Employee(String n, double s)

{

name = n;

salary = s;

}

public Employee(double s)

{

// calls the Employee(String, double) constructor

this("Employee #" + nextId, s);

}

// the default constructor

public Employee()

{

// name initialized to ""--see below

// salary not explicitly set--initialized to 0

// id initialized in initialization block

}

public String getName()

{

return name;

}

public double getSalary()

{

return salary;

}

public int getId()

{

return id;

}

private static int nextId;

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);

}

// object initialization block

{

id = nextId;

nextId++;

}

}

解决方案

Because this("Employee #" + nextId, s); includes an implicit call to the superclass constructor, which of course must be executed before the initializer block of the subclass.

Using instance initializers is generally a bad idea as they are not well known, cannot do anything more than constructors, and mixing both leads to confusion.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值