java实例化对象时程序运行顺序

当java实例化对象时,首先先进行类加载,类加载的整个过程是将类字节码引入内存,并未类中的static变量赋值。上篇文章已经大概分析了类的加载机制,下面讲一下类的实例化过程。

首先引入示例代码

父类

package test;

public class Fu {
	public int j = 9;
	public static int i = 10;
	static{
		i = 9;
		System.out.println("Fu静态代码块");
	}
	{
		j = 10;
		System.out.println("Fu构造代码块");
	}
	public Fu(){
		System.out.println("Fu_构造方法");
	}

	public int getJ() {
		return j;
	}

	public void setJ(int j) {
		this.j = j;
	}

	public void a(){
		System.out.println("父类的a方法");
	};

	public static void staticMethod(){
		System.out.println("fu");
	}
}

子类

package test;

import com.sun.org.apache.xerces.internal.impl.xpath.regex.Match;

public class Zi extends Fu{
	public int j = 0;
	static {
		i = 3;
		System.out.println("Zi静态代码块");
	}
	public static int i = 2;

	{
		System.out.println("Zi构造代码块");
	}

	public Zi(){
		System.out.println("Zi构造方法");
	}

	public void a(){
		try {
			throw new Exception();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println("子类的a方法");
	}

	public int getJ() {
		return j;
	}
	public void setJ(int j) {
		this.j = j;
	}

}

执行如下代码

程序打印结果为:

Fu静态代码块

Zi静态代码块

Fu构造代码块

Fu构造方法

Zi构造代码块

Zi构造方法

我们通过断点debug对其进行跟踪 得知具体的运行过程为:

首先先执行父类的静态变量赋值和静态代码块(具体执行顺序根据程序书写顺序确定)

然后执行子类的静态变量赋值和静态代码块

之后执行父类的成员变量赋值语句(在此时之前子类的成员变量被java程序赋初值 zi对象内有两个j变量 初始值都为0)

再执行父类的构造代码块

执行父类构造方法

执行子类成员赋值语句

执行子类构造代码块

执行子类构造方法

当我们执行如下语句时:

输出的结果为

父类的j的值9

子类的j的值0

子类的a方法

特别的:

当子类方法覆盖父类方法时,若父类方法没有声明抛出异常 则子类只能对可能出现异常的语句进行try—catch处理

java实例化对象时程序运行顺序

时间: 2025-01-31 06:58:32

java实例化对象时程序运行顺序的相关文章

Java子类继承父类,当实例化子类对象时的执行顺序

子类继承父类,当实例化子类对象时,执行顺序如下:     父类层级静态块      自身静态块     父类块      父类构造器     自身块      自身构造器 由于继承,肯定应该先加载父类再加载子类,加载类自然会调用静态块,然后是调用父类的构造函数和子类的构造函数,不过构造函数调用前肯定要先调用域或块,这样才能正确创建对象. ················································赋值顺序如下:     父类的静态变量赋值     自身的静态变

java继承时候类的运行顺序问题

子类在继承父类后,创建子类对象会首先调用父类的构造函数,先运行父类的构造函数,然后再运行子类的构造函数,例如以下所看到的: class Father{ public Father(){ System.out.println("I am father"); } } public class Child extends Father{ public Child(){ System.out.println("I am child"); } public static vo

java入门(1) 程序运行机制及运行过程

首先我们来看一下java程序在底层是怎么工作的: JAVA有两种核心机制: Java虚拟机(Java Virtual Machine): 1.java虚拟机可以理解成一个以字节码为机器指令的CPU. 2.对于不同的平台,有不同的虚拟机. 3.java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”. 垃圾收集机制(Garbage collection) 1.不再使用的内存空间应回收——垃圾收集 2.Java语言相对于C/C++而言消除了程序员回收无用内存空间的责任:提供了一种系统

JAVA 的 基础与程序运行

简介: 在最初是为家用电器设计的,因为其特性刚好适合于Internet,于是通过在Internet上的应用得以迅速流行,成为一种计算机语言,一个平台,一个网络计算的架构. JAVA语言是一种面向对象编程语言,类是java程序的基本构造单元,JAVA中的所有语句都出现在一个 类中.面向对象包括了两个基本概念:对象和类. JAVA是一种简单的,面向对象的,分布式的,解释的,安全的,可移植的,性能优秀的语言.它一其强安全性,平台无关性,硬件结构无关性,语言简洁,面向对象的特点,在网络编程语言中占据了无

UIViewController的生命周期及iOS程序运行顺序

当一个视图控制器被创建,并在屏幕上显示的时候. 代码的运行顺序 1. alloc                                   创建对象,分配空间 2.init (initWithNibName) 初始化对象,初始化数据 3.loadView                          从nib加载视图 ,通常这一步不须要去干涉.除非你没有使用xib文件创建视图 4.viewDidLoad                   加载完毕.能够进行自己定义数据以及动态创建

黑马程序员——java——获取一个应用程序运行的次数,如果超过5次,给出使用次数已到请注册的提示,并不要再运行程序

获取一个应用程序运行的次数,如果超过5次,给出使用次数已到请注册的提示,并不要再运行程序 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; public class Test5 { public static void main(String[] args) th

java实例化对象内存图/代码

实例化        new : 分四步            1 把相对用的类文件加载到静态代码段            2 调用构造方法,在栈内存开辟空间(方法只要调用,就会在栈内存开辟空间)            3 用加载进来的类,去堆内存开辟空间,并把自身的代码复制到堆内存里面,再运行构造方法,把构造方法里面的值赋值给堆内存            4 把堆内存的内存地址 赋值给前面声明的变量 代码 : public class Shi_Li_Hua{     int i;//成员变量 

直接打印Java的对象时输出的到底是什么

一 概念简介 1.打印对象和toString方法:toString方法是系统将会输出该对象的"自我描述"信息,用以告诉外界对象具有的状态信息. 2.Object 类提供的toString方法总是返回该对象实现类的类名 + @ +hashCode值. 二 打印对象实例 原文地址:https://www.cnblogs.com/thinkinpakho/p/9750101.html

java反射-反射实例化对象-反射获得构造方法-反射获得普通方法-获得属性

链接:https://www.zhihu.com/question/24304289/answer/38218810来源:知乎著作权归作者所有,转载请联系作者获得授权. Class<?> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象 第一步:获得对象,构造方法,普通方法,属性 Object obj = cls.newInstance() Constructor<?> cons = cls.get