当我们使用“this”调用另一个构造函数时,为什么在实例变量中使用static?

时间:2011-04-07 04:52:30

标签: java

我对下面的代码几乎没有什么困惑。

class TestConstructor1{
static int num,num1;
TestConstructor1(int n)
{
    this(num,num1);
    num=n;
    System.out.println("One argument constructor");
    System.out.println("Value are "+num+" and "+num1);
}
TestConstructor1(int l,int m)
{
    num=l;
    num1=m;
    System.out.println("Two argument constructor");
    System.out.println("Value are "+num+" and "+num1);
}
public static void main(String args[])
{
    TestConstructor1 ts=new TestConstructor1(10);

}
};  

构造函数被称为它必须调用的方式,即它首先调用两个参数构造函数然后调用它自己的构造函数但我有兴趣知道为什么我们必须在实例变量之前使用静态以及为什么我们不能使用实例变量声明为静态。

我在等你的回复。谢谢你...

5 个答案:

答案 0 :(得分:1)

你对如何链接构造函数感到有点困惑。这样做是这样的:

private int num,num1; // instance values, initialized by constructors

TestConstructor1(int n)
{
    this(n,0);
    System.out.println("One argument constructor");
    System.out.println("Value are "+num+" and "+num1);
}

TestConstructor1(int n,int m)
{
    super(); // this call is implicit and does not explicitly need to be in the code

    num=n;
    num1=m;
    System.out.println("Two argument constructor");
    System.out.println("Value are "+num+" and "+num1);
}

请注意,第一个调用第二个传递给它的n参数和第二个参数的合适默认值。


关于将实例变量传递给链式构造函数......这是不可能的,因为访问实例变量隐式地是对this对象的引用,在调用super构造函数之前不允许这样做完成后,你就无法调用另一个构造函数。

但是将实例变量传递给该对象的构造函数的愿望并不合乎逻辑......实质上,您在说“请用自己初始化此对象”......在此对象尚未初始化的位置。这是鸡和蛋的问题。您无法使用对象的值来初始化这些值。

答案 1 :(得分:0)

当你说静态时,它属于一个类而不是特定对象的成员变量。 如果您希望TestConstructor1的每个实例都拥有自己的num和num1副本,则删除static。

答案 2 :(得分:0)

在每个构造函数的第一行中,始终会调用super()this()。此调用完成后,实例变量将设置为其默认值。这就是为什么在调用super()this()时无法使用实例变量的原因。

答案 3 :(得分:0)

您无法在构造函数中传递实例成员,因为实例尚未初始化。您只能传递类似静态成员的常量:

public static final int DEFAULT_M = 42;

TestConstructor1(int n)
{
  this(n, DEFAULT_M);
}

此外,您不应该调用方法,除非它们是静态的或私有的,并且不能访问成员!

答案 4 :(得分:0)

我们必须使用static,因为一旦变量被声明为static,它们只会在它们的生命周期中获得一次内存,如果你不使它们变为静态,它将一次又一次地初始化。