实例初始化程序块用于初始化实例数据成员。 它在每次创建类的对象时运行。实例变量的初始化可以是直接的,但是可以在初始化实例初始化块中的实例变量时执行额外的操作。

什么是实例初始化块的使用,我们可以直接分配一个值在实例数据成员? 例如:

class Bike{
int speed=100;
}
Java

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

假设在赋值给实例数据成员时必须要执行一些操作。 如:使用for循环来填充复杂数组或错误处理等。

实例初始化程序块的示例

下面来看看实例初始化块执行初始化的简单例子。

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

执行上面代码得到以下结果 -

speed is 100
speed is 100
Shell

在Java中有三个地方可以执行实例初始化块操作:

  1. 方法
  2. 构造函数
  3. 代码块

实例初始化块或构造函数哪个先调用?

看看下面代码就知道了。

class Bike8 {
int speed; Bike8() {
System.out.println("constructor is invoked");
} {
System.out.println("instance initializer block invoked");
} public static void main(String args[]) {
Bike8 b1 = new Bike8();
Bike8 b2 = new Bike8();
}
}
Java

执行上面代码得到以下结果 -

instance initializer block invoked
constructor is invoked
instance initializer block invoked
constructor is invoked
Shell

在上面的例子中,似乎首先调用实例初始化块,但是可惜不是。 实例初始化块在对象创建时被调用。 java编译器在第一个语句super()之后的构造函数中复制实例初始化块。 首先,调用构造函数。 让我们通过下面的图来理解它:

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

实例初始化块的规则:

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

  1. 在创建类的实例时创建实例初始化程序块。
  2. 在父类构造函数被调用之后(即在super()构造函数调用之后)调用实例初始化块。
  3. 实例初始化程序块按它们显示的顺序排列。

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

class A {
A() {
System.out.println("parent class constructor invoked");
}
} class B2 extends A {
B2() {
super();
System.out.println("child class constructor invoked");
} {
System.out.println("instance initializer block is invoked");
} public static void main(String args[]) {
B2 b = new B2();
}
}
Java

上面代码执行结果如下 -

parent class constructor invoked
instance initializer block is invoked
child class constructor invoked
Java

实例块的另一个示例

class A {
A() {
System.out.println("parent class constructor invoked");
}
} class B3 extends A {
B3() {
super();
System.out.println("child class constructor invoked");
} B3(int a) {
super();
System.out.println("child class constructor invoked " + a);
} {
System.out.println("instance initializer block is invoked");
} public static void main(String args[]) {
B3 b1 = new B3();
B3 b2 = new B3(10);
}
}
Java

上面代码执行结果如下 -

parent class constructor invoked
instance initializer block is invoked
child class constructor invoked
parent class constructor invoked
instance initializer block is invoked
child class constructor invoked 10

java实例初始化块的更多相关文章

  1. 什么是Java实例初始化块

    在本篇文章,我将会使用一个例子展示什么是实例变量初始化块,实例初始化块和静态初始化块,然后说明在Java中实例初始化块是如何工作的. 执行顺序 查看下面的代码,你知道哪个先执行吗? package s ...

  2. java中初始化块、静态初始化块和构造方法

    (所谓的初始化方法init()是另一回事, 在构造方法之后执行, 注意不要混淆) 在Java中,有两种初始化块:静态初始化块和非静态初始化块.它们都是定义在类中,用大括号{}括起来,静态代码块在大括号 ...

  3. Java的初始化块及执行过程详解

    问题:Java对象初始化方式主要有哪几种?分别是什么?针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式. 还有一种与构造器作用非常相似的是初始化块, ...

  4. java静态初始化块的执行顺序

    先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...

  5. Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)

    1.执行顺序 1.1.一个类中的初始化顺序 类内容(静态变量.静态初始化块) => 实例内容(变量.初始化块.构造器) 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)= ...

  6. java静态初始化块(静态域)

    1. 类变量的初始化可通过静态初始化块来进行. 代码放在一对大括号内,大括号前用static修饰:static {……} 一个类可定义1个或多个静态初始化块. 静态初始化块会在加载时调用而且只被调用一 ...

  7. Java 静态初始化块等的执行顺序

    实例代码 package text; class Root { static{ System.out.println("Root的静态初始化块"); } { System.out. ...

  8. Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究

    Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, ...

  9. Java笔记: 初始化块

    Java语言提供了很多类初始化的方法,包括构造器.初始化器等.除了这两种方法之外,我们还可以用初始化块(initialization block)来实现初始化功能. 基本语法 初始化块是出现在类声明中 ...

随机推荐

  1. 【bzoj4036】[HAOI2015]按位或 fmt+期望

    Description 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal 的or)操作.选择数字i的概率是p[i].保证0&l ...

  2. MATLAB版本(2012b 64bit),在尝试调用svmtrain函数时报错

    问题:MATLAB版本(2012b 64bit),在尝试调用svmtrain函数时报错: 解决方案:参照https://blog.csdn.net/TIME_LEAF/article/details/ ...

  3. 【Linux】DNS服务-BIND基础配置

    1.BIND简介 现在使用最为广泛的DNS服务器软件是BIND(Berkeley Internet Name Domain),最早有伯克利大学的一名学生编写,现在最新的版本是9,有ISC(Intern ...

  4. python怎样在一行中捕获多个异常

    所属网站分类: python基础 > 异常处理 作者:浮沉 链接:http://www.pythonheidong.com/blog/article/71/ 来源:python黑洞网,专注pyt ...

  5. javascript高级程序设计---js事件思维导图

    绘制思维软件与平时用的笔记,以及导出功能,这三个问题综合起来,于是我把思维导图分开画 1.js事件的基本概念 2.js事件的事件处理程序 3.js事件的事件对象

  6. POJ3635 Full Tank? 优先队列BFS or 分层图最短路 or DP?

    然而我也不知道这是啥啊...反正差不多...哪位大佬给区分一下QWQ.. 好的,我把堆的<写反了..又调了一个小时..你能不能稳一点.... 记录状态:所在位置u,油量c,花费w 扩展状态: 1 ...

  7. 2019.3.25 SQL语句(进阶篇1)

    运算符 基本的加减乘除取余都可以在SQL中使用 新建Employee1表并添加数据 create table Employee1 (eid int primary key auto_increment ...

  8. mybatis-dao开发

    学而时习之,不亦说乎!                              --<论语> 本文以前文“mybatis-入门”为基础,同时再次提醒最佳参考资料: http://www. ...

  9. Vue添加新的响应式属性

    vm.userProfile = Object.assign({}, vm.userProfile, { age: , favoriteColor: 'Vue Green' })

  10. python 计数器Counter

    from collections import Counter colours=( ('Yasoob','Yellow',1), ('Ali','Blue',2), ('Arham','Green', ...