我知道你们讨厌帮忙完成家庭作业,但我想我还是会问...
所以,我有一个问题:
描述在构造对象时可以初始化实例变量的两种方法。
现在,第一种方法显然是将实例变量分配给构造函数的形式参数:
public class Example {
private int valueOne;
public Example(int val1) {
valueOne = val1;
}
}
但是,我仍然需要另一种方式。
一种可能性是简单地将构造函数中的实例变量分配给一个不被接受为构造函数参数的值:
public class Example {
private int valueTwo;
public Example() {
valueTwo = 2;
}
}
但这似乎是解决问题的廉价解决方案 与第一种解决方案不同。
所以,我想知道这样的事情:
public class Example {
private int valueOne = 1;
}
但是,我想知道在构造对象的时候是否仍然赋予valueOne
值1
,还是做了不同的事情?
并且,如果它确实做了不同的事情,那么问题的另一个替代方案是什么?还有其他我想念的东西吗?
答案 0 :(得分:1)
你的两种方式是我想到的两种方式。
后者在构造对象时初始化值。它实际上甚至在构造函数运行之前就已经发生了(你可以测试它):
class Example {
private int valueOne = 1;
public Example(int value)
{
System.out.println(valueOne);
valueOne = value;
System.out.println(valueOne);
}
}
...
public static void main(String[] args) {
new Example(2);
}
打印:
1
2
答案 1 :(得分:1)
我不是Java的专家,但仅仅是出于好奇,我做了谷歌搜索并得到了这个http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html它说使用构造函数来初始化实例变量有两种选择:初始化块和最终方法,但是如果您在构造[这是您的原始问题]期间考虑对象,您的答案是正确的。
答案 2 :(得分:1)
第三种方式:
class Example {
public int member;
{ // This is an instance initializer and is called before any constructor when an instance is created.
member = 1;
}
}
但据我所知,人们通常会避开实例初始化程序。
答案 3 :(得分:0)
你是对的,private int valueOne = 1;
会在创建实例时初始化变量。
答案 4 :(得分:0)
你已经有了答案。如果您正在使用IDE,我建议您启动调试器,在您调用的行上放置一个断点
new Example();
并逐步完成它。使用您建议的两个答案执行此操作,并查看以何种顺序发生的事情
答案 5 :(得分:0)
在其定义中初始化字段相当于在每个构造函数中显式或隐式调用super()
之后立即编写赋值(未明确调用this()
)。
要显示这个,请运行以下代码(这是Stack Overflow,我没有编译它):
abstract class Base {
protected Base() {
print();
}
protected abstract void print();
}
public class Derived extends Base {
private int x = 1;
public Derived() {
//super(); - automatically generate by javac
}
@Override protected void print() {
System.err.println(x);
}
public static void main(String[] args) {
new Derived();
}
}
我相信C#的行为方式不同(但你不能在字段初始化表达式中使用this
) - 如果我错了,请纠正我。