当前位置:首页 > 后端 > java > 正文内容

【Java面试题】类初始化与实例初始化

内容图文

类初始化过程

  1、一个类要创建实例需要先加载并初始化该类
    main方法所在的类需要先加载和初始化  

  2、一个子类要初始化需要父类初始化

  3、一个类初始化就是执行<clinit>()方法


    • <clinit>()方法由静态变量显示赋值代码和静态代码快组成

    • 类变量显示赋值代码和静态代码块从上到下顺序执行

    • <clinit>()方法只执行一次

实例初始化过程

  1、实例初始化就是执行<linit>()方法


    • <linit>()方法可能重载有多个,有多个构造器就有几个<linit>()方法

    • <linit>()方法有非静态实例变量显示赋值代码和非静态代码块、对应构造器代码组成

    • 非静态实例变量显示赋值代码和非静态代码块代码从上到下执行,而对应构造器的代码最后执行

    • 每次创建实例对象,调用对应构造器,执行的就是<linit>()方法

    • <linit>()方法的首行是super() 或 super(实参列表),即对应父类的<linit>()方法

案例如下:

  Father

             1
            package
             com.test.entities;

             2
             3
            /**
             4
             * 父类初始化<clinit>()方法

             5
             * (1)j = method()

             6
             * (2)父类的静态代码块

             7
             *

             8
             * 父类的实例化方法:

             9
             * (1)super() (最前)

            10
             *  (2) i = test();

            11
             *  (3) 父类的非静态代码块

            12
             *  (4) 父类的无参构造(最后)

            13
            */
            14
            public
            class
             Father {

            15
            16
            private
            int i = test();
17privatestaticint j = method();
1819static{
20         System.out.println("(1)");
21    }
22    Father(){
23         System.out.println("(2)");
24    }
25    {
26         System.out.println("(3)");
27    }
2829publicint test(){
30         System.out.println("(4)");
31return 1;
32    }
33publicstaticint method(){
34         System.out.println("(5)");
35return 1;
36    }
3738publicstaticvoid main(string[] args) {
39// 5 1 4 3 240new Father();
41    }
42 }


  Son

             1
            package
             com.test.entities;

             2
             3
            /**
             4
             * 子类的初始化<clinit>()

             5
             * (1)j = method()

             6
             * (2)子类的静态代码块

             7
             *

             8
             * 先初始化父类 (5)(1)

             9
             * 初始化子类 (10)(6 )

            10
             *

            11
             * 子类的实例化方法:

            12
             * (1)super() (最前)

            13
             *  (2) i = test();

            14
             *  (3) 子类的非静态代码块

            15
             *  (4) 子类的无参构造(最后)

            16
            */
            17
            public
            class Son extends Father {
18privateint i = test();
19privatestaticint j = method();
20static {
21         System.out.println("(6)");
22    }
23    Son(){
24super();//写或不写都存在25         System.out.println("(7)");
26    }
27    {
28         System.out.println("(8)");
29    }
30publicint test(){
31         System.out.println("(9)");
32return 1;
33    }
34publicstaticint method(){
35         System.out.println("(10)");
36return 1;
37    }
3839/**40     * 类初始化过程
41     * 1 一个类要创建实例需要先加载并初始化该类
42     *   main方法所在的类需要先加载和初始化
43     * 2 一个子类要初始化需要父类初始化
44     * 3 一个类初始化就是执行<clinit>()方法
45     *   <clinit>()方法由静态变量显示赋值代码和静态代码快组成
46     *   类变量显示赋值代码和静态代码块从上到下顺序执行
47     *   <clinit>()方法只执行一次
48     *
49     * 实例初始化过程
50     * 1 实例初始化就是执行<linit>()方法
51     *   <linit>()方法可能重载有多个,有多个构造器就有几个<linit>()方法
52     *   <linit>()方法有非静态实例变量显示赋值代码和非静态代码块、对应构造器代码组成
53     *   非静态实例变量显示赋值代码和非静态代码块代码从上到下执行,而对应构造器的代码最后执行
54     *   每次创建实例对象,调用对应构造器,执行的就是<linit>()方法
55     *   <linit>()方法的首行是super() 或 super(实参列表),即对应父类的<linit>()方法
56     *
57     * @param args
58*/59publicstaticvoid main(String[] args) {
60// (5)(1)(10)(6)
61// (9)(3)(2)(9)(8)(7)62         Son s1 = new Son();
63         System.out.println("===");
64// (9)(3)(2)(9)(8)(7)65         Son s2 = new Son();
66    }
67 }




扫描二维码推送至手机访问。

版权声明:本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:luxd@aliyun.com,感谢支持理解。


本文链接:https://luxd.cc/post/186.html

“【Java面试题】类初始化与实例初始化” 的相关文章

JDK下载安装及环境配置

JDK下载安装及环境配置

一、文章导读随着互联网的日益发展, 越来越多的小伙伴加入了程序员这个行列, 也有很多小伙伴正计划学习编程, 学习Java。那么对于新手来说, 第一件事就是下载安装Java开发工具包, 也就是JDK, 今天我们就来一起详细的说说怎么操作二、JDK版本描述· 学习环境中, 我们通常使用较新版本...

30分钟带你精通Git使用

30分钟带你精通Git使用

一、 版本控制工具1.1. 什么是版本控制系统?版本控制系统(Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件,而且可以对任何类型的文件进行版本控制。常见的版本控制系统有:cvs、sv...

Java 基础 - 面向对象

Java 基础 - 面向对象

三大特性# 封装利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。优点:减少耦合: 可以独立地开发、测试...

为IntelliJ IDEA安装插件

为IntelliJ IDEA安装插件

1. 安装插件插件是开发工具的扩展程序,通常由第三方提供,当安装了插件后,原开发工作的菜单、按钮等开发环境可能会发生变化,例如出现了新的菜单项,或出现了新的按钮,甚至一些全新的编码方式,通常,使用插件可以使得开发某些代码或实现某些功能时更加简便。绝大部分的插件的安装方式都是相同的,另有一部分插件在安...

使用IntelliJ IDEA开发Java HelloWorld

使用IntelliJ IDEA开发Java HelloWorld

1. 创建项目在IntelliJ IDEA的欢迎主界面中,点击Create New Project即可创建新的项目:2. 设置项目类型默认情况下的项目类型是Java,本次的案例目标是HelloWorld,则该选项保持不变即可。右侧可以选择JDK的版本,如果默认已经选中了1.8版,则不需要修改,直接点...