java实例初始化块
实例初始化程序块用于初始化实例数据成员。 它在每次创建类的对象时运行。实例变量的初始化可以是直接的,但是可以在初始化实例初始化块中的实例变量时执行额外的操作。
什么是实例初始化块的使用,我们可以直接分配一个值在实例数据成员? 例如:
class Bike{
int speed=100;
}
为什么要使用实例初始化块?
假设在赋值给实例数据成员时必须要执行一些操作。 如:使用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();
}
}
执行上面代码得到以下结果 -
speed is 100
speed is 100
在Java中有三个地方可以执行实例初始化块操作:
- 方法
- 构造函数
- 代码块
实例初始化块或构造函数哪个先调用?
看看下面代码就知道了。
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();
}
}
执行上面代码得到以下结果 -
instance initializer block invoked
constructor is invoked
instance initializer block invoked
constructor is invoked
在上面的例子中,似乎首先调用实例初始化块,但是可惜不是。 实例初始化块在对象创建时被调用。 java编译器在第一个语句super()
之后的构造函数中复制实例初始化块。 首先,调用构造函数。 让我们通过下面的图来理解它:
注意:java编译器在每个构造函数中会自动复制实例初始化块的代码。
实例初始化块的规则:
实例初始化块主要有三个规则。 它们如下:
- 在创建类的实例时创建实例初始化程序块。
- 在父类构造函数被调用之后(即在
super()
构造函数调用之后)调用实例初始化块。 - 实例初始化程序块按它们显示的顺序排列。
在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();
}
}
上面代码执行结果如下 -
parent class constructor invoked
instance initializer block is invoked
child class constructor invoked
实例块的另一个示例
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);
}
}
上面代码执行结果如下 -
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实例初始化块的更多相关文章
- 什么是Java实例初始化块
在本篇文章,我将会使用一个例子展示什么是实例变量初始化块,实例初始化块和静态初始化块,然后说明在Java中实例初始化块是如何工作的. 执行顺序 查看下面的代码,你知道哪个先执行吗? package s ...
- java中初始化块、静态初始化块和构造方法
(所谓的初始化方法init()是另一回事, 在构造方法之后执行, 注意不要混淆) 在Java中,有两种初始化块:静态初始化块和非静态初始化块.它们都是定义在类中,用大括号{}括起来,静态代码块在大括号 ...
- Java的初始化块及执行过程详解
问题:Java对象初始化方式主要有哪几种?分别是什么?针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式. 还有一种与构造器作用非常相似的是初始化块, ...
- java静态初始化块的执行顺序
先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...
- Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)
1.执行顺序 1.1.一个类中的初始化顺序 类内容(静态变量.静态初始化块) => 实例内容(变量.初始化块.构造器) 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)= ...
- java静态初始化块(静态域)
1. 类变量的初始化可通过静态初始化块来进行. 代码放在一对大括号内,大括号前用static修饰:static {……} 一个类可定义1个或多个静态初始化块. 静态初始化块会在加载时调用而且只被调用一 ...
- Java 静态初始化块等的执行顺序
实例代码 package text; class Root { static{ System.out.println("Root的静态初始化块"); } { System.out. ...
- Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究
Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, ...
- Java笔记: 初始化块
Java语言提供了很多类初始化的方法,包括构造器.初始化器等.除了这两种方法之外,我们还可以用初始化块(initialization block)来实现初始化功能. 基本语法 初始化块是出现在类声明中 ...
随机推荐
- samba服务器架设
#samba服务器架设方便线上linux服务器和windows服务器之间共享 1.关闭防火墙service iptables stop 2.关闭SELinuxsetenforce 0 3.安装samb ...
- FireFox调试代码技巧
本文版权归 csdn DyncRole 所有,此处为技术收藏,如有再转请标明原创作者及出处,以示尊重! 作者:DyncRole 原文:http://blog.csdn.net/qqhjqs/artic ...
- C# 委托的三种调用示例(同步调用、异步调用、异步回调)
首先,通过代码定义一个委托和下面三个示例将要调用的方法: 代码如下: public delegate int AddHandler(int a,int b); public class 加法类 { p ...
- scrollView - tableView - collectionView 滚动视图的滚动速度
介绍: 每次滚动都会触发 didScroll 这个方法, 每次滚动都会有一个偏移量,滚动的快慢决定每一次偏移量的大小,可以通过两次滚动偏移量差,判断速度,从而根据速度大小对导航栏做一些操作 { CGF ...
- JavaWeb学习笔记(十三)—— JDBC时间类型的处理
一.Java中的时间类型 Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒.毫秒以及时区的控制方法,同时也提供一些工具方法,比如日期/时间的比较,前后 ...
- opencv基本操作
src.convertTo(dst, type, scale, shift) 缩放并转换到另外一种数据类型: dst:目的矩阵 type:需要的输出矩阵类型,或者更明确的,是输出矩阵的深度,如果是负值 ...
- java.lang.ref.Reference<T>
//看之前先要知道java里面的四种引用.package com.zby.ref; import sun.misc.Cleaner; /** * 引用对象的抽象基础类.这个类定义了所有引用对象的公共操 ...
- CSS2.1
学而时习之,不亦说乎! --<论语> CSS:cascading style sheet(层叠样式表) 作用:描述页面的样式. 书 ...
- BankNote
# coding=utf-8 import pandas as pd import numpy as np from sklearn import cross_validation import te ...
- 后台返回的值ajax接收不到
原因有很多种可能,我遇到的是后台写的Controller忘记了加@ResponseBody,导致springMVC把返回的字符串当成view了