java类对象的初始化顺序

简介: java类对象的初始化顺序

在下面这个例子中,我们分别在父类和子类中测试了静态代码块、普通代码块、静态成员变量、普通成员变量、构造器、静态内部类

一:代码块及变量测试

class Field{
    public static String baseFieldInit(){
        System.out.println("父类全局变量");
        return "";
    }

    public static String baseStaticFieldInit(){
        System.out.println("父类静态变量");
        return "";
    }

    public static String fieldInit(){
        System.out.println("子类全局变量");
        return "";
    }

    public static String staticFieldInit(){
        System.out.println("子类静态变量");
        return "";
    }
}

class Father{
    static {
        System.out.println("父类静态代码块1");
    }

    private static String staticValue = Field.baseStaticFieldInit();

    static {
        System.out.println("父类静态代码块2");
    }

    {
        System.out.println("父类构造代码块1");
    }

    private String value = Field.baseFieldInit();

    {
        System.out.println("父类构造代码块2");
    }

    Father(){
        System.out.println("父类构造器");
    }
}

public class Children extends Father {

    static {
        System.out.println("子类静态代码块1");
    }
    private static String staticValue = Field.staticFieldInit();
    static {
        System.out.println("子类静态代码块2");
    }
    {
        System.out.println("子类构造代码块1");
    }
    private String value = Field.fieldInit();
    {
        System.out.println("子类构造代码块2");
    }

    public Children(){
        System.out.println("子类无参构造器");
    }

    private static class House{

        private static Children houseColor = new Children();
    }
    /**
    * 测试类
    */
    public static void main(String[] args) {
        Children children = new Children();
        System.out.println("Children:" children);
        System.out.println("*******************************");
        
        // 第二遍
        Children children1 = new Children();
        System.out.println("Children:" children1);
        System.out.println("*******************************");
    }
}

二:测试结果

父类静态代码块1
父类静态变量
父类静态代码块2
子类静态代码块1
子类静态变量
子类静态代码块2
父类构造代码块1
父类全局变量
父类构造代码块2
父类构造器
子类构造代码块1
子类全局变量
子类构造代码块2
子类无参构造器
Children:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************
父类构造代码块1
父类全局变量
父类构造代码块2
父类构造器
子类构造代码块1
子类全局变量
子类构造代码块2
子类无参构造器
Children:com.zhixie.jvmclassload.demo.Children@1be6f5c3
*******************************

三:测试静态内部类

public static void main(String[] args) {
    Children chouse = House.houseColor;
    System.out.println("ChildrenHouse:" chouse);
    System.out.println("*******************************");
    Children chouse1 = House.houseColor;
    System.out.println("ChildrenHouse:" chouse1);
    System.out.println("*******************************");
}
父类静态代码块1
父类静态变量
父类静态代码块2
子类静态代码块1
子类静态变量
子类静态代码块2
父类构造代码块1
父类全局变量
父类构造代码块2
父类构造器
子类构造代码块1
子类全局变量
子类构造代码块2
子类无参构造器
ChildrenHouse:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************
ChildrenHouse:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************

四:总结

经过我们反复调整顺序进行测试后,可得出如下结论:
**1、静态代码块、静态成员变量只有第一次加载类时才会执行。
2、执行顺序为:父类静态代码块及父类静态成员变量(并列优先级)--->子类静态代码块及子类静态成员变量(并列优先级)--->父类普通代码块及父类成员变量--->父类构造器--->子类普通代码块及子类成员变量--->子类构造器。
3、静态内部类,只有在第一次调用的时候才会被初始化。**

目录
相关文章
|
17天前
|
Java
Java快速入门之类、对象、方法
本文简要介绍了Java快速入门中的类、对象和方法。首先,解释了类和对象的概念,类是对象的抽象,对象是类的具体实例。接着,阐述了类的定义和组成,包括属性和行为,并展示了如何创建和使用对象。然后,讨论了成员变量与局部变量的区别,强调了封装的重要性,通过`private`关键字隐藏数据并提供`get/set`方法访问。最后,介绍了构造方法的定义和重载,以及标准类的制作规范,帮助初学者理解如何构建完整的Java类。
|
15天前
|
安全 Java
Object取值转java对象
通过本文的介绍,我们了解了几种将 `Object`类型转换为Java对象的方法,包括强制类型转换、使用 `instanceof`检查类型和泛型方法等。此外,还探讨了在集合、反射和序列化等常见场景中的应用。掌握这些方法和技巧,有助于编写更健壮和类型安全的Java代码。
30 17
|
19天前
|
存储 Java C++
Java数组:静态初始化与动态初始化详解
本文介绍了Java中数组的定义、特点及初始化方式。
51 12
|
1月前
|
Java
java代码优化:判断内聚到实体对象中和构造上下文对象传递参数
通过两个常见的java后端实例场景探讨代码优化,代码不是优化出来的,而是设计出来的,我们永远不可能有专门的时间去做代码优化,优化和设计在平时
31 15
|
3月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
190 58
|
2月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
3月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
93 8
|
3月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
3月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
106 17
|
3月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。