【问题标题】:Initializer block for instance variables实例变量的初始化块
【发布时间】:2013-10-29 19:29:08
【问题描述】:

“Java 编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。”

我已阅读本教程:http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

  1. 我不明白。当初始化程序块存在并完成构造函数的工作时,构造函数的需求是什么,换句话说,作为构造函数的替代品?

  2. 哦,但是在创建实例时必须调用构造函数。好的!但是初始化块需要什么?

  3. “因此,这种方法可用于在多个构造函数之间共享代码块。” 有人可以给我一个例子吗?我的意思是我不明白。

提前谢谢你。

【问题讨论】:

  • 对于 3) 我认为它的意思是这样的:class Foo { private int bar = 10; private int baz = 20; public Foo() { } public Foo(Foo anotherFoo) {} } 你不需要在两个构造函数中初始化变量。
  • [Java 中初始化器与构造器的使用][1] [1]:stackoverflow.com/questions/804589/… 希望对您有所帮助

标签: java


【解决方案1】:

我不明白。初始化器时需要什么构造函数 块在那里并且做一个构造函数的工作,换句话说 作为构造函数的替代品?

只有构造函数创建对象,而不是初始化块,因此需要构造函数。

哦,但是在创建实例时必须调用构造函数。 好的!但是初始化块需要什么?

当您的类中有不同的构造函数时,您可以使用初始化程序块来节省代码重复。

【讨论】:

  • 我们如何避免重复代码?构造函数是否包含初始化块或者它们是否隐式调用它们?是的,我读过 java 编译器将所有初始化程序块复制到每个构造函数中。 java 编译器是否隐式自动执行此操作而不告诉我,还是我必须在构造函数中编写一些代码以便将初始化程序块复制到那里。
  • @user2882662 Java 编译器会将初始化代码复制到构造函数中。您可以轻松地享受 java 编译器为您完成的工作。查看生成的代码应该有助于让你更清楚。
【解决方案2】:

对初始化块唯一真正需要的是static 变体,它允许您对static final 变量执行更复杂的初始化。

构造函数和初始化块的区别在于构造函数构造对象,而初始化块被复制到每个构造函数中。如果你不指定构造函数(即使你指定了初始化块),编译器仍然会生成一个默认构造函数来处理对象构造。

您可以让不同 构造函数执行不同 代码,但无论调用哪个构造函数,都会执行所有初始化程序块。您当然可以编写一个private 方法与您的初始化程序块相同,并使您的代码更具可读性,但与初始化程序块不同,您需要从构造函数手动调用它们。

【讨论】:

    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 2017-04-05
    • 2011-03-18
    • 2010-11-26
    • 1970-01-01
    • 2013-08-14
    • 2013-07-04
    • 2010-10-16
    相关资源
    最近更新 更多