查看原文
其他

【Java编程教程】详解Java 实例初始化

点击关注 👉 Java面试那些事儿 2023-09-01

整理:Java面试那些事儿


Instance Initializer block用于初始化实例数据成员。它在每次创建类的对象时运行。


实例变量的初始化可以直接完成,但在实例初始化块中初始化实例变量时可以执行额外的操作。


Que)当我们可以直接在实例数据成员中赋值时,实例初始化块的用途是什么?例如:


class Bike{ int speed=100; }


文末福利

文末领取:651页Java面试题库


# 为什么要使用实例初始化块?


假设我必须在为实例数据成员赋值时执行一些操作,例如用于填充复杂数组的 for 循环或错误处理等。


实例初始化块的示例


让我们看一下执行初始化的实例初始化程序块的简单示例。

class Bike7{ int speed;
Bike7(){System.out.println("速度是"+speed);}
{speed=100;}
public static void main(String args[]){ Bike7 b1=new Bike7(); Bike7 b2=new Bike7(); } }


输出:

速度是100速度是100


java中可以在三个地方进行操作:方法constructor堵塞


# 首先调用什么,实例初始化块或构造函数?


class Bike8{ int speed;
Bike8(){System.out.println("构造函数被调用");}
{System.out.println("实例初始化块被调用");}
public static void main(String args[]){ Bike8 b1=new Bike8(); Bike8 b2=new Bike8(); } }


输出:

实例初始化块被调用构造函数被调用构造函数被调用


在上面的示例中,似乎首先调用了实例初始化程序块,但没有。实例初始化块在对象创建时被调用。Java 编译器在构造函数中的第一个语句 super() 之后复制实例初始化块。所以首先,构造函数被调用。关注公众号Java面试那些事儿,获取651页Java面试题让我们通过下图来理解它:


注意:java 编译器在每个构造函数中复制实例初始化块的代码。


# 实例初始化块的规则:


实例初始化块主要有三个规则。它们如下:


  1. 实例初始化块是在创建类的实例时创建的。

  2. 在调用父类构造函数之后(即在 super() 构造函数调用之后)调用实例初始化块。

  3. 实例初始化块按照它们出现的顺序出现。


# 在 super() 之后调用的实例初始化程序块的程序


class A{ A(){ System.out.println("调用父类构造函数"); } } class B2 extends A{ B2(){ super(); System.out.println("调用子类构造函数"); }
{System.out.println("实例初始化块被调用");}
public static void main(String args[]){ B2 b=new B2(); } }


输出:

调用父类构造函数实例初始化块被调用调用子类构造函数


# 实例块的另一个例子


class A{ A(){ System.out.println("调用父类构造函数"); } }
class B3 extends A{ B3(){ super(); System.out.println("调用子类构造函数"); }
B3(int a){ super(); System.out.println("调用子类构造器"+a); }
{System.out.println("实例初始化块被调用");}
public static void main(String args[]){ B3 b1=new B3(); B3 b2=new B3(10); } }


输出:

父类构造函数被调用实例初始化块被调用子类构造函数被调用父类构造函数被调用实例初始化块被调用调用子类构造函数 10



程序员技术交流群


扫码进群记得备注:城市、昵称和技术方向


热门推荐:


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存