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

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

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. samba服务器架设

    #samba服务器架设方便线上linux服务器和windows服务器之间共享 1.关闭防火墙service iptables stop 2.关闭SELinuxsetenforce 0 3.安装samb ...

  2. FireFox调试代码技巧

    本文版权归 csdn DyncRole 所有,此处为技术收藏,如有再转请标明原创作者及出处,以示尊重! 作者:DyncRole 原文:http://blog.csdn.net/qqhjqs/artic ...

  3. C# 委托的三种调用示例(同步调用、异步调用、异步回调)

    首先,通过代码定义一个委托和下面三个示例将要调用的方法: 代码如下: public delegate int AddHandler(int a,int b); public class 加法类 { p ...

  4. scrollView - tableView - collectionView 滚动视图的滚动速度

    介绍: 每次滚动都会触发 didScroll 这个方法, 每次滚动都会有一个偏移量,滚动的快慢决定每一次偏移量的大小,可以通过两次滚动偏移量差,判断速度,从而根据速度大小对导航栏做一些操作 { CGF ...

  5. JavaWeb学习笔记(十三)—— JDBC时间类型的处理

    一.Java中的时间类型 Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒.毫秒以及时区的控制方法,同时也提供一些工具方法,比如日期/时间的比较,前后 ...

  6. opencv基本操作

    src.convertTo(dst, type, scale, shift) 缩放并转换到另外一种数据类型: dst:目的矩阵 type:需要的输出矩阵类型,或者更明确的,是输出矩阵的深度,如果是负值 ...

  7. java.lang.ref.Reference<T>

    //看之前先要知道java里面的四种引用.package com.zby.ref; import sun.misc.Cleaner; /** * 引用对象的抽象基础类.这个类定义了所有引用对象的公共操 ...

  8. CSS2.1

    学而时习之,不亦说乎!                              --<论语> CSS:cascading style sheet(层叠样式表) 作用:描述页面的样式. 书 ...

  9. BankNote

    # coding=utf-8 import pandas as pd import numpy as np from sklearn import cross_validation import te ...

  10. 后台返回的值ajax接收不到

    原因有很多种可能,我遇到的是后台写的Controller忘记了加@ResponseBody,导致springMVC把返回的字符串当成view了