构造代码块的执行顺序

1.编译器会把构造代码块插入到每一个构造函数中,如果构造函数中使用了this关键字调用其他构造函数,则该构造函数中就不会插入构造代码块,以免构造代码块被重复执行。

举例说明

public class Student {
/**
*
*/
private static final long serialVersionUID = 2205426314406978220L;

/**
* 姓名
*/
private String name;

/**
* 年龄
*/
private int age;

{
// 构造代码块
System.out.println("我是构造代码块");
this.name = "无名氏";
this.age = 100;
}

/**
*
*/
public Student() {
System.out.println("我是无参构造函数:Student()");
}

public Student(String name, int age) {
this();
if (name != null && !name.trim().equals("")) {
this.name = name;
}
if (age > 0) {
this.age = age;
}
System.out.println("我是有参构造函数:Student(String name, int age)");
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "[name:" + this.name + " age:" + this.age + "]";
}

/**
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
public int compareTo(Student o) {
if (this == o) {
return 0;
}
if (o == null) {
return 1;
}
return this.age - o.getAge();
}

public static Pair<Student> minmax(List<Student> list) {
if (list == null || list.size() == 0) {
return null;
}
Student min = list.get(0);
Student max = list.get(0);
for (Student p : list) {
if (min.compareTo(p) > 0) {
min = p;
}
if (max.compareTo(p) < 0) {
max = p;
}
}

return new Pair<Student>(min, max);
}
}


测试类

public class Test {
public static void main(String[] args) throws IOException {
Student student = new Student();
System.out.println("student:" + student.toString());
System.out.println("------分割线------");
Student student2 = new Student("李雷", 20);
System.out.println("student2:" + student2.toString());
}
}


执行结果如下:
我是构造代码块
我是无参构造函数:Student()
student:[name:无名氏 age:100]
------分割线------
[b]我是构造代码块[/b]
我是无参构造函数:Student()
我是有参构造函数:Student(String name, int age)
student2:[name:李雷 age:20]

黑体字部分的构造代码块只打印了一次,且在无参构造函数之前,说明有参构造函数没有再次调用构造代码块。


2.子类的构造函数中调用父类的构造函数(调用super方法),并不影响子类构造代码块的执行。编译器会将子类构造代码块插入到super方法之后执行。

举例说明

public class StudentLeader extends Student {

/**
*
*/
private static final long serialVersionUID = -4052233131592706287L;

{
System.out.println("我是学生领袖构造代码块");
}

/**
*
*/
public StudentLeader() {
super();
}
}


测试类代码

public class Test {
public static void main(String[] args) throws IOException {
StudentLeader leader = new StudentLeader();
}
}


执行结果如下:
我是构造代码块
我是无参构造函数:Student()
[b]我是学生领袖构造代码块[/b]

可以看出,StudentLeader类的构造代码块在Student无参构造函数执行之后才执行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值