测试下你是否真的理解JAVA运行机以及执行顺序

java代码如下所示:
class Name {
Name() {
   Screen.print("8", "Name instance constructor!");
}
Name(String value) {
   Screen.print("9", "Name instance constructor with: " + value);
}
static {
   Screen.print("10", "Name static init block");
}
}
class Person {
private Name name = new Name();
static {
   Screen.print("5", &quoterson static init block!");
}
Person() {
   Screen.print("6", "Person instance constructor!");
}
{
   Screen.print("7", "Person instance init block!");
}
}
public class Customer extends Person {
static Name name = new Name("Tom");
static {
   Screen.print("2", "Customer static init block!");
}
{
   Screen.print("3", "Customer instance init block!");
}
Customer() {
   Screen.print("4", "Customer instance constructor!");
}
public static void main(String[] args) {
   Screen.print("1", "Customer Initial Test!");
   Person p = new Customer();
}
}
class Screen {
static void print(String sn, String msg) {
   System.out.println("P[" + sn + "] - " + msg);
}
}
你能直接说出它的运行结果是什么吗?
执行结果输出为:
P[5] - Person static init block!
P[10] - Name static init block
P[9] - Name instance constructor with: Tom
P[2] - Customer static init block!
P[1] - Customer Initial Test!
P[8] - Name instance constructor!
P[7] - Person instance init block!
P[6] - Person instance constructor!
P[3] - Customer instance init block!
P[4] - Customer instance constructor!
你回答是否正确呢?
为什么呢?
解释如下:
Java code { Screen.print("7", "Person instance init block!"); } 
叫实例初始化块 
Java code static{ Screen.print("2", "Customer static init block!"); } 
叫静态初始化块

类加载优先级顺序为: 
   static区(static初始化块和类static实例变量) > 类的非static初始化区(实例初始化块和实例变量) > 类构造函数 
static区在第一次遇到该类时就被加载,非static区和构造函数在天津网站建设创建对象(既new)时加载。同一个类的多个static区之间按代码出现的先后顺序加载,非static区亦然。static只加载一次,为类所有,不是为类对象所有。 
该程序中: 
1.进入Customer类,检查发现有extends,存在父类Person。 
2.进入Person类,检查Person无父类存在,但有static区,执行输出"5"。因Person没被创建,所以非static区和Person构造函数不被加载。 
3.进入Customer类程序体,发现有多个static区。 
      第一个为static Name name = new Name("Tom")。创建Name,进入Name类,加载Name静态初始化快,输出"10"。无非static区,则加载相应构造函数,输出"9"。 
      第二个出现的static是"2",输出 
4.进入main线程,运行第一行输出"1" 
5.创建一个无参Customer()对象。因为Person类是其父类,创建子类时,系统必自动创建一个父类对象。 
      再次进入Person类,按顺序先创建Name对象。进入Name类,其static区已被加载,不需要再加载。没有非static区。调用相应构造函数,输出"8",退出name类。加载Person类第二个非static区,输出"7",然后加载其构造函数输出"6",退出Person。 
      进入Customer类,加载初始化块输出"3",然后是构造函数输出"4" 
6.退出main线程

时间: 2024-08-27 13:11:46

测试下你是否真的理解JAVA运行机以及执行顺序的相关文章

Java Object 构造方法的执行顺序

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

浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~

简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring框架的,这就说明你有权选择是否要用AOP来完成一些业务. AOP面向切面编程,通过另一种思考的方式,来弥补面向对象编程OOP当中的不足,OOP当中最重要的单元是类,所以万物皆对象,万物皆是 对象类.而在AOP的模块单元中,最基础的单元是切面,切面对切点进行模块化的管理. 最后再提一句:Spring当

深入了解Java面向对象之程序执行顺序

Java中main方法,静态,非静态的执行顺序详解 Java程序运行时,第一件事情就是试图访问main方法,因为main相等于程序的入口,如果没有main方法,程序将无法启动,main方法更是占一个独立的线程,找到main方法后,是不是就会执行mian方法块里的第一句话呢?答案是不一定  看看下面两种最常见的情况: 第一种情况: main方法在一个具有其他方法或属性的类中: public class Test1 { public static String name; public Test1(

Java return和finally执行顺序

在Java语法中,return表示当前执行的结束,finally则是在当前代码块一定会执行的代码块.如果return在finally在之前执行,finally也会执行吗?答案是肯定的! 但是,finally和return的执行顺序则并不是真正意义上的先后顺序. 1 public String test(){ 2 String s = ""; 3 try { 4 s = "try"; 5 System.out.println(s); 6 return s; 7 } c

夯实Java基础系列7:一文读懂Java 代码块和执行顺序

目录 Java中的构造方法 构造方法简介 构造方法实例 例 1 例 2 Java中的几种构造方法详解 普通构造方法 默认构造方法 重载构造方法 java子类构造方法调用父类构造方法 Java中的代码块简介 Java代码块使用 局部代码块 构造代码块 静态代码块 Java代码块.构造方法(包含继承关系)的执行顺序 参考文章 微信公众号 Java技术江湖 个人公众号:黄小斜 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github

Java中代码块执行顺序

代码块:在Java中,使用{}括起来的代码被称为代码块.根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期.构造代码块:在类中的成员位置,用{}括起来的代码.每次调用构造方法执行前,都会先执行构造代码块.作用:可以把多个构造方法中的共同代码放到一起,对对象进行初始化.静态代码块:在类中的成员位置,用{}括起来的代码,只不过它用static修饰了.作用:一般是对类进行初始化. 静态代码块,构造代码块,构造方法的执行顺序? 首先执行静态代码块 接着执行构造代码块 最后指向

你真的理解Java的按引用传递吗?

首先我们来看下面这段代码: public class Test1 { String a = "123"; public static void change(Test1 test) { test.a="abc"; } public static void main(String[] args) { Test1 test1=new Test1(); System.out.println(test1.a); change(test1); System.out.print

深入理解java中HelloWorld的执行流程

HelloWorld.java是我们学习java的第一个程序,简单的再也不能简单了,可是里面的原理以及执行流程大家都知道吗?最近在复习java知识,特地钻研了一番分享给大家! 贴出HelloWorld的代码如下: public class HelloWorld { public static void main(String[] args) { String s ; s = “Hello World!”; //定义字符串s System.out.println(s); } } 分析内存图: He

java中的一些执行顺序,代码块,静态,构造,成员。。。。(转的)

Java初始化顺序(转来的) 1在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入) 2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)4,装载子类B后,完成静态动作类装载完成,开始进行实例化1,在实例化子类B时,先要实例化父类A2,实例化父类A时,先成员实例化(非静态代码)3,父类A的构造方法4,子类B的成员实例化(非静态代码)5,子类B的构造方法 先