来说说Java中的实例初始化器

标签: 基础技术 Java | 发表时间:2014-08-31 22:43 | 作者:strongme
出处:http://www.importnew.com

文首先给出个例子来探究下什么是 实例变量初始化器,什么是 实例初始化器,以及什么是 静态初始化器。然后看看实例初始化器是怎么工作的。

1. 执行的顺序

先看看下面这段代码,你觉着哪部分会先被执行呢?

public class Foo {
 
    //instance variable initializer 实例变量初始化器
    String s = "abc";
 
    //constructor 构造函数
    public Foo() {
        System.out.println("constructor called");
    }
 
    //static initializer   静态初始化器
    static {
        System.out.println("static initializer called");
    }
 
    //instance initializer 实例变量初始化器
    {
        System.out.println("instance initializer called");
    }
 
    public static void main(String[] args) {
        new Foo();
        new Foo();
    }
}

输出如下:

static initializer called
instance initializer called
constructor called
instance initializer called
constructor called

2. Java的实例初始化器是如何工作的?

上面的例子中的实例初始化器包含一段打印字符的代码。要理解它是如何工作的,我们可以把它想象成变量赋值的过程,这样就不难理解了。

除了这么赋值:

int b = 0;

还可以这么写:

int b;
b = 0;

因此,实例初始化器和实例变量初始化器就大同小异了。

3. 什么时候会用到实例初始化器?

能用到实力初始化器的时候比较少。但有些时候还是一个实例变量初始化器的替代选择,比如:

  • 初始化代码必须处理异常情况
  • 执行一个实例变量没办法进行的计算

当然,这些需求还是可以在构造函数中实现的。但是一个类有多个构造函数的话,你就得在每个构造函数里面重复同样的代码了。

写在实例初始化器中的代码,无论你使用哪一个构造函数,实例初始化器中代码都会被执行(可能说的多,用的少吧)。

另一个实例初始化器的应用场景是匿名内部类,因为这种情况下根本就不能创建构造函数。(这可能是放置日志代码的好地方?)

参考: Java的初始化
首发: strongme

相关文章

相关 [java 实例 初始化] 推荐:

来说说Java中的实例初始化器

- - ImportNew
文首先给出个例子来探究下什么是 实例变量初始化器,什么是 实例初始化器,以及什么是 静态初始化器. 然后看看实例初始化器是怎么工作的. 先看看下面这段代码,你觉着哪部分会先被执行呢. //instance variable initializer 实例变量初始化器. //constructor 构造函数.

Java 类初始化顺序

- - Java - 编程语言 - ITeye博客
  对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是. 1.(静态变量、静态初始化块)注:这两个的初始化顺序为在类中先后出现的顺序. 2(变量、初始化块)注:这两个的初始化顺序为在类中先后出现的顺序.  我们也可以通过下面的测试代码来验证这一点:. public static String staticField = "静态变量";.

java 类和对象的初始化

- - Web前端 - ITeye博客
  在Java中,类装载器把java类装载到虚拟机中,经过装载,链接和初始化三个步骤来完成. 其中链接中包括 校验、准备和解析. 下面对这些概念进行解析:. 装载:查找和导入类或接口的二进制数据,常用的是根据类的路径加载,还有根据网络的地址加载. 链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的;.

java中一个对象的初始化过程

- - CSDN博客编程语言推荐文章
/* 该类演示了一个对象的初始化过程 */ class Person {. //堆内存默认初始化为null. private static String country="中国"; //静态属性,存在于方法区,随着类的加载而加载. System.out.println("静态代码块执行");. System.out.println("构造代码块执行");.

java类加载中不会触发初始化的被动引用

- - Java - 编程语言 - ITeye博客
我们知道,在初始化一个类时,如果它的父类没有进行初始化,那么JVM就会触发其父类的初始化动作. 但是,当我们引用类的时候,可不一定会触发其初始化,这种引用类的方式称为被动引用. 可是没有竟然没有对Child类进行初始化. 这是因为val为静态字段,只有直接定义这个字段的类才会被初始化,故通过子类来引用父类静态字段val,只会触发Father类的初始化,而不会触发Child类的初始化,so 就没有Child类的事.

Java NIO服务器实例

- - ImportNew
我一直想学习如何用Java写一个 非阻塞IO服务器,但无法从网上找到一个满足要求的服务器. 我找到了 这个示例,但仍然没能解决我的问题. 还可以选择 Apache MINA框架. 但我的要求相对简单,MINA对我来说还稍微有点复杂. 所以在MINA和一些教程(参见 这篇和 这篇)的帮助下,我自己写了一个非阻塞IO服务器.

k-means聚类JAVA实例

- - CSDN博客互联网推荐文章
《mahout in action》第六章. datafile/cluster/simple_k-means.txt数据集如下:. 1、从D中随机取k个元素,作为k个簇的各自的中心. 2、分别计算剩下的元素到k个簇中心的相异度,将这些元素分别划归到相异度最低的簇. 3、根据聚类结果,重新计算k个簇各自的中心,计算方法是取簇中所有元素各自维度的算术平均数.

Java DelayQueue使用实例

- - Java - 编程语言 - ITeye博客
DelayQueue是一个支持延时获取元素的无界阻塞队列. 队列使用PriorityQueue来实现. 队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素. 只有在延迟期满时才能从队列中提取元素. 我们可以将DelayQueue运用在以下应用场景:. 缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取元素时,表示缓存有效期到了.

[Java 8] Lambda 表达式实例

- - Java - 编程语言 - ITeye博客
Java 8 中的 Lambda 表达式,允许将函数作为形参传递给另外的函数. 为了更好地理解,我们用实例的方式来演示如何使用 Lambda 表达式. 1、Lambda 表达式 Hello World. 这是一个最简单的 Lambda 表达式的例子. 首先在 main 方法的上面声明了一个接口 HelloWorld,在 main 方法中实现了这个接口,随后调用了接口的唯一方法.

Java 实例内部类 总结

- - ITeye博客
private String name = "外部类的字符串成员";. System.out.println(name);// 内部类可以访问外部类的所有成员. // 实例内部类InnerClass:在外部类以外的其他类中,必须通过外部类的实例创建内部类的实例. InnerClass2 mmy = new InnerClass2();    //错误.