美文网首页JAVA
Java类初始化顺序

Java类初始化顺序

作者: 云鲸鱼rain | 来源:发表于2019-03-04 15:15 被阅读1次

今天看了一道面试题。


Java类初始化顺序


这种基础知识,在大学学过,校招时在牛客网恶补过,最终不过一忘,所以还是来记录一下。

先上一种没有继承关系的类。

图片来源:https://blog.csdn.net/xyajia/article/details/80922329
代码:
package test;

public class Father {
    
    public static String staticField = printStaticField();
    
    public String field = printField();
    
    static {
        System.out.println("【静态代码块】");
    }
    
    {
        System.out.println("【非静态代码块】");
    }
    
    public static String printStaticField() {
        System.out.println("【静态变量】");
        return "静态变量";
    }
    
    public String printField() {
        System.out.println("【非静态变量】");
        return "非静态变量";
    }
    
    public Father() {
        System.out.println("【构造方法代码块】");
    }
    
    
    public static void main(String[] args) {
        new Father();
    }
}

输出:

【静态变量】
【静态代码块】
【非静态变量】
【非静态代码块】
【构造方法代码块】

这时候有个问题:静态变量和静态代码块的先后顺序呢?非静态变量和非静态代码块的先后顺序呢?
答:经测试,就是代码写的先后顺序。

再来一种有继承关系的类。

图片来源:https://blog.csdn.net/xyajia/article/details/80922329
代码(父类):
package test;

public class Father {
    
    public static String staticField = printStaticField();
    
    public String field = printField();
    
    static {
        System.out.println("【父类-静态代码块】");
    }
    
    {
        System.out.println("【父类-非静态代码块】");
    }
    
    public static String printStaticField() {
        System.out.println("【父类-静态变量】");
        return "父类-静态变量";
    }
    
    public String printField() {
        System.out.println("【父类-非静态变量】");
        return "父类-非静态变量";
    }
    
    public Father() {
        System.out.println("【父类-构造方法代码块】");
        show();
    }
    
    public void show() {
        System.out.println("【父类-普通方法】");
    }
}

代码(子类):

package test;

public class Son extends Father {
    
    public static String staticField = printStaticField();
    
    public String field = printField();
    
    static {
        System.out.println("【子类-静态代码块】");
    }
    
    {
        System.out.println("【子类-非静态代码块】");
    }
    
    public static String printStaticField() {
        System.out.println("【子类-静态变量】");
        return "子类-静态变量";
    }
    
    public String printField() {
        System.out.println("【子类-非静态变量】");
        return "子类-非静态变量";
    }
    
    public Son() {
        System.out.println("【子类-构造方法代码块】");
        show();
    }
    
    public void show() {
        System.out.println("【子类-普通方法】");
    }
    
    
    public static void main(String[] args) {
        new Son();
    }
}

输出(换行是我人为换行,为了方便观察):

【父类-静态变量】
【父类-静态代码块】
【子类-静态变量】
【子类-静态代码块】

【子类-非静态变量】//这里出现 子类 的原因是:子类方法被父类方法 覆盖
【父类-非静态代码块】
【父类-构造方法代码块】
【子类-普通方法】//这里出现 子类 的原因是:子类方法被父类方法 覆盖

【子类-非静态变量】
【子类-非静态代码块】
【子类-构造方法代码块】
【子类-普通方法】

在这里增加一个继承关系里的方法覆盖知识点。
如果不想让父类方法被覆盖,那么可以用 在父类方法上加 final 关键字,但是加了关键字之后,子类中根本不允许存在和父类方法名相同的方法(方法参数一致的情况)。 那么还可以用 private 关键字,嗯,可以实现了。

相关文章

  • 构造器内部的多态方法的行为

    上一篇 :Java类初始化顺序 上一节我们简单总结了类的初始化顺序。父类(静态变量、静态初始化块)>子类(静态变量...

  • 类初始化和加载过程

    一、对象的初始化顺序: java类加载器加载类的顺序:http://blog.csdn.net/crazycode...

  • JAVA的类加载顺序

    理解关于java类的加载顺序 首先来捋一捋java类的加载顺序吧 父类静态代码块 》》静态代码初始化,静态属性(带...

  • Java类加载与初始化

    今天复习了一下java类加载时的初始化顺序,先记录一下心得,代码后续补上。 类加载时的初始化顺序 1、一般来说,类...

  • Java类的初始化顺序

    Java类的初始化顺序 (静态变量、静态代码块)> 类里的 main()(如果有的话) > (变量、初始化块) >...

  • Java和Kotlin类的初始化顺序

    Java Java程序初始化的顺序:父类静态变量 -> 父类静态代码块 -> 子类静态变量 -> 子类静态代码块 ...

  • 设计模式——工厂,策略,建造者

    Java 类初始化顺序基本分为以下几种:静态块,初始化块,静态方法,构造函数块,静态变量,成员变量对于块顺序,静态...

  • java 类初始化 顺序

    Java 类初始化介绍 java语言在使用过程中最先开始就是初始化,在工作中如果遇到什么问题需 要定位往往到最后也...

  • java类初始化顺序

    1.静态代码块,静态变量,按代码顺序先后执行.2.构造代码块,成员变量,按代码顺序先后执行.3.先执行构造块或成员...

  • Java类初始化顺序

    开始记录之前,我想先上一张图片,这是书本上给出的代码示例,不知道大家的第一感觉是什么,反正我第一次看到这段代码的时...

网友评论

    本文标题:Java类初始化顺序

    本文链接:https://www.haomeiwen.com/subject/akfiuqtx.html