1、调用顺序:
JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。
先初始化父类的静态代码-->;初始化子类的静态代码-->;
(创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码-->;初始化父类构造函数-->;初始化子类非静态代码-->;初始化子类构造函数
2 、类只有在使用New调用创建的时候才会被JAVA类装载器装入
3、创建类实例时,首先按照父子继承关系进行初始化
4、类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从本类继承的子类的初始化块执行,最后是子类的构造方法
5、类消除时候,首先消除子类部分,再消除父类部分
1. 父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
2. 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
3. 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
4. 父类构造方法
5. 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
6. 子类构造方法
注意:
只有当通过new对象实例或静态变量被访问时,静态变量才被初始化;
如:Person类,有静态变量a和b,通过Person.a的方式,变量a被初始化,但是变量b没有被出示化。
代码如下:
/**
* 父类
*
* @author 张国明 [url=mailto:guomingzhang2008@163.com]guomingzhang2008@163.com[/url]
* @version 2012-07-27 下午1:15
*/
public abstract class Father {
private static final String NAME = "父类";
// 静态成员变量和静态初始化块级别相同 所以按照在代码中的顺序依次执行
// 1、初始化父 静态成员变量 static int sage
static int sage = getNumber(50, NAME);
// 2、初始化父 静态初始化块 static
static {
System.out.println("父类 base static block");
}
//5、初始化父类的非静态代码:非静态成员变量和非静态初始化块级别相同
public int age = getNumber(100, NAME);
//6、初始化块:非静态成员变量和非静态初始化块级别相同
{
System.out.println("父类 base nonstatic block");
}
//7、初始化父类构造函数
Father() {
System.out.println("父类 构造器 base start");
System.out.println(age);
draw();// 会调用子类覆盖后的方法
System.out.println("父类 构造器 base end");
}
static int getNumber(int base, String name) {
System.out.println(name + " base.getNumber int" + base);
return base;
}
private void draw() {
System.out.println("父类 base.draw");
}
}
/**
* 子类
*
* @author 张国明 [url=mailto:guomingzhang2008@163.com]guomingzhang2008@163.com[/url]
* @version 2012-07-27 下午1:16
*/
public class Son extends Father {
private static final String NAME = " 子类";
// 静态成员变量和静态初始化块级别相同 所以按照在代码中的顺序依次执行
//3、初始化子 静态成员变量 static int sage
static int sage = getNumber(250, NAME);
//4、初始化子 静态初始化块 static
static {
System.out.println(" 子类 subclass static block");
}
//8、初始化子类的非静态代码:非静态成员变量和非静态初始化块级别相同
public int age = getNumber(1001, NAME);
//9、初始化子类的非静态代码:非静态成员变量和非静态初始化块级别相同
private int _radius = getNumber(10, NAME);
//10、初始化块:非静态成员变量和非静态初始化块级别相同
{
System.out.println(" 子类 subclass nonstatic block");
}
//11、初始化子类构造函数
Son(int radius) {
System.out.println(" 子类 构造器 base start");
_radius = radius;
draw();
System.out.println(age);
System.out.println(" 子类 initializeOrder initialized");
System.out.println(" 子类 构造器 base end");
}
private void draw() {
System.out.println(" 子类 initializeOrder.draw " + _radius);
}
/**
* @param args args
*/
public static void main(String[] args) {
new Son(1000);
}
}
分享到:
相关推荐
Java类执行顺序详解+实例(阿里面试题)+详细讲解+流程图
NULL 博文链接:https://gaoyu.iteye.com/blog/393658
Java类的完整构造执行顺序
Java类的基本运行顺序_Java教程共1页.pdf.zip
java教程 由浅入深详解Java 类的实例化顺序 在子类对象被实例化的过程中,变量、构造方法以及代码块三者的先后顺序为: 1. 父类的静态变量和静态代码块,按代码先后顺序执行 2. 子类的静态变量和静态代码块,按...
java提供的注解技术,这里很基础的提供了注解的简单实现样例,SpringMVC采用了很多的注解,基本简单案例展现想了解下注解的同学,对类的方法进行顺序注解后,可以按照注解自动按照顺序调用方法。
JAVA程序执行顺序,你了解了吗
Java中的继承与静态static等的执行先后顺序的面试题 java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。 package extend; public class X { Y y=new Y(); ...
今天小编就为大家分享一篇对java for 循环执行顺序的详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
顺序存储结构线性表的java实现代码,要在jdk1.6以上环境下运行
浅析Java中静态块与静态方法的区别与联系,执行顺序。
java反射之后类属性的顺序默认是不变的,利用注解可改变反射之后类属性顺序。运行TestMain类即可看到效果
Java中什么时候类加载,第一次需要使用类信息时加载。类加载的原则:延迟加载,能不加载就不加载。下面这篇文章主要介绍了Java中类的加载顺序,需要的朋友可以参考借鉴,下面来一起看看吧。
HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个实例成员变量 invokeByObject.java 对象实参传递示例程序 invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用...
java ClassLoader的学习 java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class... 一个类如果要被JVM所调度执行,必须先把这个类加载到JVM内存里,java.lang下有个很重要的类ClassL
使用java控制台展示执行顺序,很不错的。
Java类加载顺序笔试题 Nicobar:Java 的动态脚本和模块加载器框架 Nicobar 是一个 Java 动态脚本框架,由强大的基于 . 脚本可以是源代码,用 JVM 兼容语言(如 Groovy)编写,也可以是编译后的字节码,以 .class ...
当然题意没有这么直白,题目只要求你写出程序运行后所有System.out.println的输出结果,其中程序是题目给的,而各个System.out.println的执行顺序不同会导致后程序输出的结果也不同。 具体的题目我肯定记不清,...