[转载] Java 语言中的实例初始化块 ( IIB) 详解

参考链接: Java中的实例初始化块(IIB)

在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB )。不过我觉得介绍的有点简单了,于是,再写一篇文章详细介绍下吧。 

Java 语言中,存在三种操作:方法 、构造函数 和 初始化块。 

其中初始化块又分为 实例初始化块 ( IIB ) 和 静态初始化块。本章节,我们主要介绍实例初始化块。 

实例初始化块 用于初始化实例变量。 

实例初始化块 会在初始化类的一个实例时执行,而且在构造函数之前就执行。并且每次创建类的对象时它们都会执行。 

实例化块的语法 

实例初始化块一般放在构造函数之前,使用大括号 {} 扩起来的代码。语法结构一般如下 

class JavaTester 

    // 实例化块 

    {  

        System.out.println("IIB block"); 

    } 

     

    // 构造函数

    JavaTester() 

    { 

        System.out.println("Constructor Called"); 

    } 

    public static void main(String[] args) 

    { 

        JavaTester a = new JavaTester(); 

    } 

}

 

 

 注意,实例化块并不是类的必须。只是一个可选项。用于抽出构造函数的公共部分单独执行而已。 

 

这段代码是可以编译运行的,运行结果如下 

[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester

IIB block

Constructor Called

 

一个类中包含多个实例初始化块 

类中的 实例初始化块 并不是类所必须的,而且,不限数量。一个类既可以没有实例初始化块,也可以有多个实例初始化块。 

如果一个类有多个实例初始化块,那么它们会按照顺序从上到下依次执行,也就是说,定义在类顶部的实例初始化块最先执行。 

我们来看一段代码,下面的类 JavaTester 定义了多个实例初始化块。 

class JavaTester 

    {  

        System.out.println("IIB1 block 1 "); 

    } 

    

    { 

        System.out.println("IIB2 block 2"); 

    } 

       

    JavaTester() 

    { 

        System.out.println("Constructor Called"); 

    } 

      

    { 

        System.out.println("IIB3 block 3"); 

    } 

     

    public static void main(String[] args) 

    { 

        JavaTester a = new JavaTester(); 

    } 

 

运行上面这段代码,输出结果如下 

[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester

IIB1 block 1 

IIB2 block 2

IIB3 block 3

Constructor Called

 

父类中的初始化块 

在 Java 语言的继承体系中,父类同样可以有初始化块,而且数量不限。 

父类的实例初始化块在子类的构造函数中调用 super() 之后立即运行。编译器会在执行当前类的实例初始化块之前先执行父类的实例初始化块。 

是不是很绕口,我们写一段代码来演示下 

class B 

    B() 

    { 

        System.out.println("B-Constructor Called"); 

    } 

  

    { 

        System.out.println("B-IIB block"); 

    } 

  

}

 

public class JavaTester extends B 

    {  

        System.out.println("JavaTester IIB1 block 1 "); 

    } 

    

    { 

        System.out.println("JavaTester IIB2 block 2"); 

    } 

       

    JavaTester() 

    { 

        super(); 

        System.out.println("JavaTester-Constructor Called");

    } 

      

    { 

        System.out.println("JavaTester IIB3 block 3"); 

    } 

     

    public static void main(String[] args) 

    { 

        JavaTester a = new JavaTester(); 

    } 

}

 

运行以上范例,输出结果如下 

[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester

B-IIB block

B-Constructor Called

JavaTester IIB1 block 1 

JavaTester IIB2 block 2

JavaTester IIB3 block 3

JavaTester-Constructor Called

 

从运行的结果来看,当创建类 JavaTester 的对象时,编译器尝试执行类 JavaTester 的构造函数。但因为它有一个父类,在发现了 super() 语句后,就转而先执行父类的构造函数。 

因此,在继承体系中,实例初始化块和构造函数的执行顺序如下 

执行父类的实例初始化块执行父类的构造函数执行当前类的实例初始化块执行当前类的构造函数 

实例初始化块的要点 

我们一起来回顾下实例初始化块的要点。 

每次创建新实例时都会运行实例初始化块初始化块按它们在类中出现的顺序运行如果存在父类,则首先会实例化父类然后在调用当前类的实例初始化块,最后再调用当前类的构造函数。 

 

 声明:本文首发 简单教程,网址为 https://www.twle.cn/t/454#reply0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不用正则表达式,用javascript从零写一个模板引擎(一)

前言 模板引擎的作用就是将模板渲染成html,html render(template,data),常见的js模板引擎有Pug,Nunjucks,Mustache等。网上一些制作模板引擎的文章大部分是用正则表达式做一些hack工作,看完能收获的东西很少。本文将使用编译原理那套理论来打…

[转载] Java静态绑定与动态绑定

参考链接: Java中的静态绑定与动态绑定 程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定. 静态绑定: 在程序执行前方…

关于批量插入数据之我见(100万级别的数据,mysql)

2019独角兽企业重金招聘Python工程师标准>>> 因前段时间去面试,问到如何高效向数据库插入10万条记录,之前没处理过类似问题,也没看过相关资料,结果没答上来,今天就查了些资料,总结出三种方法&am…

各个OS关于查看磁盘和wwn号的方法

1,HP-UX几个命令1)查看型号,和uname -a差不多model2)查看光纤卡信息ioscan -funC fc3) 查看扫描出的磁盘信息ioscan -fucC disk4)查看磁盘及其对应的路径ioscan -m dsf5) 查看划分过来的lunioscan -m lun6) 查看磁盘大小diskinfo …

[转载] Java是不是面向对象的程序

参考链接: 为什么Java不是纯粹的面向对象语言 转载自:https://blog.csdn.net/a21700790yan/article/details/80129053 Java——是否确实的 “纯面向对象”?让我们深入到Java的世界,试图来证实它。 在我刚开始学习 Java 的前面几…

极速理解设计模式系列:6.适配器模式(Adapter Pattern)

四个角色:目标抽象类角色(Target)、目标对象角色(Adapter)、源对象角色(Adaptee)、客户端角色(Client) 目标抽象类角色(Target):定义需要实现的目标接口 目标对象角色(Adapter):调用另外一个源对象,并且转换…

[转载] Java之继承

参考链接: Java多重继承 Java之继承 继承是面向对象程序的一个基本特征,通过继承可以实现父子关系,以及代码的复用。通过继承实现的类称为子类,被继承的类称为父类,所有直接或间接被继承的类都称为父类。 Java类体…

Spark(二): 内存管理

2019独角兽企业重金招聘Python工程师标准>>> Spark 作为一个以擅长内存计算为优势的计算引擎,内存管理方案是其非常重要的模块; Spark的内存可以大体归为两类:execution和storage,前者包括shuffles、joins、sorts和agg…

[转载] 手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis

参考链接: Java继承类的对象创建 本文发表于2016年6月,写于作者学生时期。文中使用到的技术和框架可能不是当下最佳实践,甚至很不“优雅”。但对于刚接触JavaEE和Spring的同学来说,还是能有很多收获的,大牛轻拍 我们…

多播、组播、广播优缺点分析

2019独角兽企业重金招聘Python工程师标准>>> 单播、多播和广播单播”(Unicast)、“多播”(Multicast)和“广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究…

[转载] Java重载、覆盖与构造函数

参考链接: Java中的继承和构造函数 /** * 拷贝构造函数---Copyf t2 new Copyf(t1);就不会在调用默认构造函数了。 * 复制clone和引用 * 重载是在同一个类(范围)中,覆盖是子类对父类而言。 重载不关心返回值类型。 静态方法不能被…

LOFTERD18B542F16FF685FD684F427B4…

2019独角兽企业重金招聘Python工程师标准>>> 验证 转载于:https://my.oschina.net/jinhengyu/blog/1572124

[转载] Java获取一个类继承的父类或者实现的接口的泛型参数

参考链接&#xff1a; Java中的接口和继承 泛型的作用就不多介绍了&#xff0c;如果你想具备架构设计能力&#xff0c;那么熟练使用泛型是必不可少的。 不多说了&#xff0c;先定义泛型父类和泛型接口&#xff1a; package cn.zhh; public class Parent<T1, T2> { …

PHP系列(一)PHP流程控制结构

while(){} do{ }while(); for( 表达式1; 表达式2;表达式3 ){ 语句或语句序列; } if(){} if(){ }elseif{} <?php $i0; while(true) { if($i>100) break; echo ".$i.<br>"; $i; } ?> <?php echo "<table border1800>"; echo &quo…

[转载] Scala继承与Java的区别

参考链接&#xff1a; Java中将final与继承一起使用 在之前的笔记Java静态属性和方法的继承问题中&#xff0c;通过具体的实验证明&#xff0c;在子类中重写父类的字段时并没有覆盖父类的字段&#xff0c;只是隐藏了父类的字段。而在scala中则不同&#xff0c;scala子类的同名…

Source Map调试压缩后代码

在前端开发过程中&#xff0c;无论是样式还是脚本&#xff0c;运行时的文件可能是压缩后的&#xff0c;那这个时候调试起来就很麻烦。 这个时候&#xff0c;可以使用Source Map文件来优化调试&#xff0c;Source Map是一个信息文件&#xff0c;里面储存着原代码位置信息&#x…

[转载] Python3十大经典错误及解决办法

参考链接&#xff1a; Python中的关键字2 ◆ ◆ ◆ ◆ ◆ 接触了很多Python爱好者&#xff0c;有初学者&#xff0c;亦有转行人。不论大家学习Python的目的是什么&#xff0c;总之&#xff0c;学习Python前期写出来的代码不报错就是极好的。下面&#xff0c;严小样儿为大家罗…

两台电脑间大量数据拷贝的快捷方法

可能大家会遇到需要将一台电脑里的数据拷贝到另外一台电脑&#xff0c;最常用的方法是用u盘或移动硬盘等存储设备来拷贝&#xff0c;这样速度慢&#xff0c;而且可能拷贝多次才能将数据拷贝完。现提供一种方法&#xff0c;就是通过windows 的文件共享来实现。通过千兆网线直接连…

[转载] 使用 Web 标准生成 ASP.NET 2.0 Web 站点

参考链接&#xff1a; 使用super访问Java祖父母的成员 Stephen WaltherSuperExpert.com 适用于&#xff1a; Microsoft ASP.NET 2.0 (Beta 2) Microsoft Visual Studio .NET 2005 Microsoft Visual Web Developer 摘要&#xff1a; Microsoft ASP.NET 2.0 具有很多有用的功能…

Office快捷键大全之三(Access快捷键下篇)

向下键 向某帮助主题的末尾滚动 Page Up 以较大增量向某帮助主题的开头滚动 Page Down 以较大增量向某帮助主题的末尾滚动 Home 移到某帮助主题的开头 End 移到某帮助主题的末尾 CtrlP 打印当前帮助主题 CtrlA 选定整个帮助主题 CtrlC 将选定项复制到"剪贴…