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]
------分割线------
我是构造代码块
我是无参构造函数: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()
我是学生领袖构造代码块
可以看出,StudentLeader类的构造代码块在Student无参构造函数执行之后才执行。
分享到:
相关推荐
在探讨继承中子类与父类构造函数及静态块的执行顺序时,我们首先需要理解构造函数和静态块的基本概念及其在Java中的作用。构造函数主要用于初始化对象的状态,而静态块则是在类加载到内存中时执行的一段代码,通常...
在Java编程语言中,了解代码块的执行顺序对于编写高效且无错的代码至关重要。这里我们将深入探讨Java中的普通代码块(实例初始化块)和静态代码块...希望这个实例和解释能帮助你更好地理解和应用Java的代码块执行顺序。
本文将深度剖析几个常见的Java面试题目,包括方法重写、静态代码块和构造方法的执行顺序。 首先,我们来讨论**方法重写(Override)**。在面向对象编程中,子类可以继承父类的属性和方法,有时需要根据自己的需求对...
1 静态变量,静态代码块(类加载时执行,类不加载不执行) 2 实例变量,实例代码块(创建对象时才执行,不创建对象不执行) 3 构造函数,(创建对象时执行完2后再执行构造函数,不管构造函数是public还是private...
Android代码块执行顺序分析总结 Android代码块执行顺序是指在Java中,代码块、变量、方法的加载顺序是一个重要的知识点,对于Android开发者来说尤其重要。本文将详细介绍Android代码块执行顺序的分析总结。 一、...
Java编程语言中有三种类型的代码块,它们分别是普通代码块、构造代码块和静态代码块,每种都有其特定的用途和执行顺序。 1. **普通代码块**: 普通代码块(也称为局部代码块)是在方法或者类的成员变量声明之间...
5. 执行构造代码块(如果有的话)。 关于方法重写(Override)和重载(Overload): - 重载发生在同一类中,方法名相同,但参数列表不同(参数类型、个数或顺序不同)。 - 重写发生在父类和子类之间,方法名、返回...
构造代码块的执行顺序是在构造函数之前,且每个对象都要执行一次构造代码块。构造代码块的作用是将类的所有对象初始化成一样的值,以防止构造函数中初始化的变量被修改。 例如: ``` class Person{ String gender;...
先静态代码块,然后构造代码块,再是构造方法,然后方法里面的代码块按顺序执行。 子类继承父类的时候,先执行父类的静态代码块,然后子类的静态代码块,然后父类的构造代码块和构造方法,再是子类的构造代码块和...
2. 接着,`Parent`类的静态变量`d2`被初始化,这触发了`Delegate`类的加载和初始化,输出:“Delegete类的静态代码块”,“Delegete类的构造代码块”,“Delegete类的构造方法Parent静态变量d2”。 3. 然后,`Parent...
}`,打印出 "调用userSay静态方法" 和 "进入静态构造代码块"。 2. 其次执行实例代码块 `{ System.out.println("进入代码块"); }`,打印出 "进入代码块"。 3. 最后执行 `main` 方法,创建 `User` 对象实例,并执行其...
- **构造代码块执行顺序**: - 类的构造代码块在每次创建新实例时都会被执行。 - 如果子类继承了父类,则先执行父类构造代码块,再执行子类构造代码块。 - **构造器执行顺序**: - 在构造一个子类的对象时,...
在继承关系中,静态代码块的执行顺序是:父类静态代码块 -> 子类静态代码块 -> 父类非静态代码块 -> 父类构造方法 -> 子类非静态代码块 -> 子类构造方法。 静态代码块和静态方法的区别在于:静态代码块是自动执行的...
2. **执行顺序**:静态代码块的执行优先于构造代码块和构造函数。这是因为类的加载发生在对象创建之前。 3. **适用场景**:静态代码块主要用于初始化类级别的资源或者数据,比如数据库连接、日志配置等,这些通常是...
每当创建类的新实例时,构造代码块就会执行,且它的执行顺序优先于类的构造函数。这意味着,如果在构造代码块中有初始化操作,这些操作会在构造函数执行之前完成。如果类中有多条构造代码块,它们也会按照在类中定义...
在Java编程语言中,类的初始化过程涉及到几个关键的概念,包括静态代码块、构造代码块和构造方法。这些概念在创建对象和管理类的状态时起着至关重要的作用。以下是关于这三个概念的详细解释: 1. **静态代码块**: ...
而类初始化则是指在类首次被使用时,JVM执行的一系列初始化操作,包括静态变量赋值、静态代码块执行等。 根据题目提供的内容,我们可以总结出Java类构造执行的详细步骤,这些步骤确保了类的正确初始化以及对象的...
Java代码块的加载顺序是按照静态代码块、构造代码块、局部代码块的顺序加载的。 (一)静态代码块的加载 静态代码块是在类加载时执行的,只加载一次,用于对类进行一些初始化。 (二)构造代码块的加载 构造代码...
Java基础之代码块 Java 中的代码块是指用一对花括号 {} 包围的代码区域,这些代码块可以...Java 中的代码块有三种:普通语句块、构造块和静态块,每种代码块的执行时机不同,需要根据实际情况选择合适的代码块类型。