请分析构造方法,静态代码块构造代码块的运行先后顺序java
时间: 2024-02-17 21:04:15 浏览: 225
在Java中,构造方法、静态代码块和构造代码块都是用于类的初始化。它们的执行顺序如下:
1. 静态代码块:在类加载时执行,只执行一次,且先于其他代码块和构造方法执行。
2. 构造块:在每次创建对象时执行,在构造方法之前执行。
3. 构造方法:在每次创建对象时执行,是对象初始化的入口。
示例代码如下:
```
public class MyClass {
static {
System.out.println("执行静态代码块");
}
{
System.out.println("执行构造代码块");
}
public MyClass() {
System.out.println("执行构造方法");
}
public static void main(String[] args) {
System.out.println("开始创建对象");
MyClass myClass = new MyClass();
System.out.println("对象创建完成");
}
}
```
运行结果如下:
```
执行静态代码块
开始创建对象
执行构造代码块
执行构造方法
对象创建完成
```
可以看到,静态代码块先于构造代码块和构造方法执行,而构造代码块在构造方法之前执行。
相关问题
请分析构造方法,静态代码块,构造代码块的运行先后顺序java
在Java中,构造方法、静态代码块和构造代码块的运行顺序如下:
1. 静态代码块:在类加载时调用,只会被执行一次,并且在构造代码块和构造方法之前执行。
2. 构造代码块:在每次创建对象时都会被执行,优先于构造方法执行。
3. 构造方法:在构造代码块执行完之后被执行。
例如,下面是一个简单的示例:
```
public class Example {
static {
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
}
public Example() {
System.out.println("构造方法");
}
public static void main(String[] args) {
new Example();
new Example();
}
}
```
输出结果为:
```
静态代码块
构造代码块
构造方法
构造代码块
构造方法
```
可以看出,静态代码块只会被执行一次,而构造代码块和构造方法会在每次创建对象时都被执行。另外,在同一个类中,静态代码块会优先于构造代码块和构造方法执行。
用下面知识点-初始化代码块和构造函数 加载顺序: 加载类 --> 静态变量、静态代码块(先后顺序加载) --> 成员变量、普通代码块 --> 构造方法 父类静态变量、静态代码块 --> 子类静态变量、静态代码块 --> 父类成员变量、普通代码块--> 父类构造方法----> 子类成员变量、普通代码块--> 子类构造方法 静态代码块(只加载一次) 构造方法(创建一个实例就加载一次) 静态方法需要调用才会执行 【题目】在Test.java文件中创建一个公共类Test,同时在文件中创建三个类Root、Mid和Leaf,其中Leaf继承Mid,Mid继承Root;为三个类提供类初始化块和实例初始化块,在Mid类里使用this调用重载的构造器,而Leaf使用super显示调用其父类指定的构造器。在Test类的main方法中分别创建两个Leaf类的对象,验证初始化代码块及构造函数的执行顺序。
以下是Test.java文件的代码:
```
public class Test {
public static void main(String[] args) {
Leaf leaf1 = new Leaf();
Leaf leaf2 = new Leaf();
}
}
class Root {
static {
System.out.println("Root的静态代码块");
}
{
System.out.println("Root的实例代码块");
}
public Root() {
System.out.println("Root的构造函数");
}
}
class Mid extends Root {
static {
System.out.println("Mid的静态代码块");
}
{
System.out.println("Mid的实例代码块");
}
public Mid() {
this("调用重载的构造器");
System.out.println("Mid的无参构造函数");
}
public Mid(String s) {
System.out.println("Mid的带参构造函数:" + s);
}
}
class Leaf extends Mid {
static {
System.out.println("Leaf的静态代码块");
}
{
System.out.println("Leaf的实例代码块");
}
public Leaf() {
super("调用父类指定的构造器");
System.out.println("Leaf的无参构造函数");
}
}
```
输出结果为:
```
Root的静态代码块
Mid的静态代码块
Leaf的静态代码块
Root的实例代码块
Root的构造函数
Mid的实例代码块
Mid的带参构造函数:调用重载的构造器
Mid的无参构造函数
Leaf的实例代码块
Leaf的带参构造函数:调用父类指定的构造器
Leaf的无参构造函数
Root的实例代码块
Root的构造函数
Mid的实例代码块
Mid的带参构造函数:调用重载的构造器
Mid的无参构造函数
Leaf的实例代码块
Leaf的带参构造函数:调用父类指定的构造器
Leaf的无参构造函数
```
可以看到,初始化代码块和构造函数的执行顺序符合题目中所给的加载顺序。同时,Leaf类使用super显示调用其父类指定的构造器,而Mid类使用this调用重载的构造器,验证了题目中的要求。
阅读全文