Java 中对象如何初始化呢?

Java-经验王 Java经验 发布时间:2021-08-29 10:11:36 阅读数:18930 1 Java对象
下文讲述Java代码的初始化过程,如下所示:
今天面试时,被问到:“Java对象如何初始化呢?”
脑袋里面立刻浮现出"构造器"初始化,
  面试官:“立马回应到”,没错,构造器是Java对象中常见的初始化方法,
那是否还有其它的初始化方法呢?
答案是
--------------------------------------------------
静态代码块
    采用静态代码块的方式
例:
   [修饰符]{

  //初始化块的可执行代码

  ...

}
--------------------------------------------------

注意事项:
    此处的修饰符只能为static
例:
public class User {

    //定义一个初始化块
    {
        System.out.println("初始化块-1");
    }
    //定义第二个初始化块
    {
        System.out.println("初始化块-2");
    }
    //定义无参的构造器
    public User() {
        System.out.println("无参构造器");
    }
    
    public static void main(String[] args) {
        
        new User();
    }
}
---------运行以上代码,将输出以下信息------
初始化块-1
初始化块-2
无参构造器

/*
从以上的代码运行上,我们可以得到结论:
  当我们new一个User对象时,
   程序会先运行静态代码块,然后再运行无参构造器
*/
----------------------------------------------------

初始化块和构造方法区别

  1. 构造器可接收参数,而静态代码块不能接收任何参数
  2. 代码块通常用于初始化操作,如:静态代码块对类进行初始化,普通代码块负责对对象进行初始化
例:
普通代码块和静态块的运行顺序示例分享
class GongJu{
    static {
        System.out.println("GongJu的静态初始化块");
    }
    {
        System.out.println("GongJu的普通初始化块");
    }
    public GongJu(){
        System.out.println("GongJu的无参构造器");
    }
}

class Che extends GongJu{
    static {
        System.out.println("Che的静态初始化块");
    }
    {
        System.out.println("Che的普通初始化块");
    }
    public Che(){
        System.out.println("Che的无参构造器");
    }
    public Che(String name){
        this();//调用同类中的重载构造器
        System.out.println("Che的带参构造器,name="+name);
    }
}

class QiChe extends Che{
    static {
        System.out.println("QiChe的静态初始化块");
    }
    {
        System.out.println("QiChe的普通初始化块");
    }
    public QiChe(){
        //调用父类中带参数的构造器
        super("Java典籍");
        System.out.println("QiChe的无参构造器");
    }
}

public class Test {

    public static void main(String[] args) {
        new QiChe();
        System.out.println("=========");
        new QiChe();
    }

}
-------运行以上代码,将输出以下信息--------------
GongJu的静态初始化块
Che的静态初始化块
QiChe的静态初始化块
GongJu的普通初始化块
GongJu的无参构造器
Che的普通初始化块
Che的无参构造器
Che的带参构造器,name=Java典籍
QiChe的普通初始化块
QiChe的无参构造器
=========
GongJu的普通初始化块
GongJu的无参构造器
Che的普通初始化块
Che的无参构造器
Che的带参构造器,name=Java典籍
QiChe的普通初始化块
QiChe的无参构造器
第一次创建QiChe对象时,
此时系统还未有QiChe对象,
因此需要先加载并初始化QiChe类,
初始化QiChe类会先执行其顶层父类的静态初始化块,
再执行其直接父类的静态初始化块,
最后才执行其本身的静态初始化块。

一旦QiChe类初始化成功后,其在虚拟机中一直存在,
当第二次再创建QiChe对象时
无需再对QiChe类进行初始化。
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202108/1630203145887.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者