2012-01-22 27 views
2

我知道你们讨厌家庭作业帮助,但我想我可能会问,反正...构建对象时可以初始化两种方法实例变量?

所以,我有一个问题:

描述两种方式的一个实例变量可以被初始化时一个对象被构造。现在

,第一种方式显然是实例变量分配给构造函数的形式参数:

public class Example { 
    private int valueOne; 
    public Example(int val1) { 
     valueOne = val1; 
    } 
} 

不过,我仍然需要另一种方式。

一种可能是简单地在构造函数实例变量分配给不接受作为构造函数的参数的值:

public class Example { 
    private int valueTwo; 
    public Example() { 
     valueTwo = 2; 
    } 
} 

但是,这似乎只是一个廉价的解决方案,即”不是个问题t 不同于第一种解决方案。

所以,我想知道的是这样的:

public class Example { 
    private int valueOne = 1; 
} 

不过,我在想,如果仍然在对象的构造的时间分配valueOne价值1,或者做一些不同的东西?

而且,如果确实做了一些不同的事情,那么问题的另一种选择是什么?还有什么我失踪?

+1

你为什么不试试? – ARRG

+1

你有你的答案。 –

+2

我们并不讨厌帮助作业,只要你首先在这个问题上付出一些努力并在问题中展示出来,就像你做的那样 – Robin

回答

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 
+0

它实际上是构造函数的一部分。它发生在隐式或显式调用'super()'之后。 –

+0

是的,但我的意思是,它发生在任何可以在构造函数中编写的代码运行之前,如示例所示。 –

+0

您可以在'super'或'this'调用中编写代码。 –

0

你是对的,private int valueOne = 1;会在实例创建时初始化变量。

0

你已经有你的答案。如果您正在使用IDE的工作,我建议你打开调试器,放置一个断点在您调用

new Example(); 

,并通过它一步一步的行。用你的两个建议答案来做这件事,看看会发生什么,看看会发生什么。

1

的第三种方式:

class Example { 
     public int member; 

     { // This is an instance initializer and is called before any constructor when an instance is created. 
     member = 1; 
     } 
} 

但人们通常会避免实例的初始化程序,据我所知。

0

在其定义中初始化该字段相当于在每个构造函数(不明确调用this())的显式或隐式调用super()之后立即写入赋值。

为了证明这一点,运行下面的代码(这是堆栈溢出,我没有这么多,因为它编译):

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字段初始化表达式) - 纠正我,如果我错了。