Java构造方法的执行顺序

1.如果类里边没有定义任何构造方法,则系统将添加一个默认的无参构造方法。

 

Class ThisClass{

}

默认隐式添加无参的构造方法,相当于

Class ThisClass{
	public ThisClass(){
	}
}

2.构造方法的执行顺序。

    (1)如果构造方法中没有在第一条语句中显式调用父类的构造方法,也没有调用本类的重载构造方法,则系统会在执行该构造方法时默认添加调用父类无参构造方法。

public ThisClass(){

}

默认隐式添加父类无参构造方法,相当于

public ThisClass(){
	super();
}

     (2)如果构造方法中在第一条语句调用了本类的重载构造方法,则执行该类的重载构造方法,执行的规则同上。

public ThisClass(){
	this(3);
}
public ThisClass(int x){

}

当调用ThisClass的无参构造方法时,因其第一句调用本类的重载构造方法,所以程序进入有参的重载方法中执行,有参构造方法符合(1)的情况,所以隐式添加父类的构造方法。

注:

    (1)显式调用父类的构造方法和调用本类的其他重载构造方法都要求必须放在构造方法的第一条语句,所以同一个构造方法中不能既调用父类的构造方法,又调用本类的其他重载构造方法。

 
    (2)子类构造方法中没有显式调用父类构造方法时,系统默认调用父类无参构造方法,而如果父类没有无参构造方法,则出现编译错误。

附: 当new一个对象时,代码的执行顺序

public class Test {
	public static void main(String[] args) {
		System.out.println("×××××第一次new B对象×××××");
		new B();
		System.out.println("×××××第二次new B对象×××××");
		new B();
	}
}

class A {

	{
		System.out.println("父类A的自由块");
	}

	A() {
		System.out.println("父类A的构造方法\n");
	}

	D d = new D("父类A的成员变量被初始化\n");

	static {
		System.out.println("父类A的静态自由块");
	}

	static D dd = new D("父类A的静态成员变量被初始化\n");
}

class B extends A {

	static D ddd = new D("子类B的静态成员变量被初始化");

	static {
		System.out.println("子类B的静态自由块\n");
	}

	D dddd = new D("子类B的成员变量被初始化");

	B() {
		super();
		System.out.println("子类B的构造方法");
	}

	{
		System.out.println("子类B的自由块\n");
	}
}

class D {
	D(String str) {
		System.out.println(str);
 	}
}

执行结果:

×××××第一次new B对象×××××
父类A的静态自由块
父类A的静态成员变量被初始化

子类B的静态成员变量被初始化
子类B的静态自由块

父类A的自由块
父类A的成员变量被初始化

父类A的构造方法

子类B的成员变量被初始化
子类B的自由块

子类B的构造方法
×××××第二次new B对象×××××
父类A的自由块
父类A的成员变量被初始化

父类A的构造方法

子类B的成员变量被初始化
子类B的自由块

子类B的构造方法

时间: 2024-11-05 17:27:28

Java构造方法的执行顺序的相关文章

Java静态代码块、构造代码块、构造方法的执行顺序

Java静态代码块.构造代码块.构造方法的执行顺序 静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存.所以静态的会优先非静态的. 执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步: 1,super语句,可能出现以下三种情况: 1)构造方法体的第一行是this语句,则不会执行隐式三步, 2)构造方法体的第一行是super语句,则调用相应的父类的构造方法

Java Object 构造方法的执行顺序

Java Object 构造方法的执行顺序 @author ixenos 为了使用类而做的准备工作包括三个步骤 1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class对象 2)链接:验证字节码,为静态域(只是static修饰的域,不包含static final )分配存储空间,解析此类对其他类的所有引用 3)初始化:若该类有超类,对其初始化,执行静态初始化器(构造器算一个)和静态初始化块. 类初始化时构造方法执行顺序 对于某一个子类时: (1)初始化对象的存储空

静态块、main方法、构造块、构造方法的执行顺序

在牛客网做题,遇到关于静态块.main方法.构造块.构造方法的执行顺序的问题,添加该随笔记之. 题目是写出如下java代码执行后所打印的顺序: 1 public class B 2 { 3 public static B t1 = new B(); 4 public static B t2 = new B(); 5 { 6 System.out.println("构造块"); 7 } 8 static 9 { 10 System.out.println("静态块")

java中代码执行顺序

之前面试的时候有一道题,是考java的代码执行顺序的. 在大三的时候学习java语言的时候有说,但是在实际工作中用的比较少,所以在这里重新记录复习一下. 比如下面这段代码: class helloA{ public helloA(){ System.out.println("helloA"); } { System.out.println("I'm A"); } static { System.out.println("Static A"); }

Java子父类间静态代码块、非静态代码块、构造方法的执行顺序

子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 也就是说非静态初始化块的执行顺序要在构造函数之前. class FatherStaticTest { static { System.out.println("执行父类的静态代码块."); } FatherStaticTest() { System.out.println(&qu

【Java基础】继承中的代码块和构造方法的执行顺序探索

本文讲述有关一个类的静态代码块,构造代码块,构造方法的执行流程问题.首先来看一个例子 /** * Created by lili on 15/10/19. */ class Person{ static { System.out.println("执行Person静态代码块"); } { System.out.println("执行Person构造代码块"); } public Person(){ System.out.println("执行Person构

Java:初始化块、静态初始化块、构造方法的执行顺序

1. 静态初始化块 静态初始化块只在类首次加载时执行一次,同时静态初始化块只能给静态变量赋值,不能给普通成员变量赋值. 2. (非静态)初始化块 (非静态)初始化块在每次生成实例对象时都执行一次,可以给任意变量赋值. 3. 构造方法 构造方法在每次生成实例对象时都执行一次 4. 执行顺序:静态初始化块 --> 初始化块 --> 构造方法 测试代码如下: 1 public class Son extends Father { 2 static int sNum = 0; 3 int num =

static静态块 构造方法 普通语句块 在java中的执行顺序

1 public class Par { 2 3 public Par() { 4 System.out.println("父类--constructor"); 5 } 6 7 static { 8 System.out.println("父类--statc"); 9 } 10 11 { 12 System.out.println("父类普通代码块"); 13 } 14 } 15 16 public class Sub extends Par {

java代码块执行顺序

1.测试类 public class Demo extends SuperDemo { //静态代码块 static{ System.out.println("this is static block"); } //普通代码块 { System.out.println("this is normal block"); } //默认构造函数 public Demo(){ System.out.println("this is demo constructor