通过构造函数初始化构造函数会产生意外结果吗?

时间:2014-03-22 23:23:25

标签: java initialization

自从过去几天以来,我一直在混淆如何通过构造函数初始化实例属性。

考虑一下这个案例

class Demo
{
    int a;
    int b;
    Demo(int a,int b)
    {
        this.a*=a;//this produces 0 here 
        this.b*=b;//this produces 0 here
    }
    public static void main(String[] args)
    {
        Demo d1=new Demo(20,30);
        d1.show();
    }
    public void show()
    {
        System.out.println(this.a);
        System.out.println(this.b);
    }
}

这是如何初始化的。我知道构造函数初始化一次值。可以多次分配。

5 个答案:

答案 0 :(得分:3)

整数的初始值为0.您的实际分配是:

a = 0 * 20

始终返回0.

Some documentation

  

在声明字段时,并不总是需要分配值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或null,具体取决于数据类型。但是,依赖于这样的默认值通常被认为是糟糕的编程风格。

enter image description here

答案 1 :(得分:2)

默认情况下,积分字段初始化为0(根据JLS §4.12.5),因此将this.a(0)和this.b(0)乘以a和{{1分别不会改变它们的值0.零次任何数字仍为零。

答案 2 :(得分:0)

最初this.a(类变量)为零,因此当你将它乘以a(参数)时它将产生零。这是你的问题。

答案 3 :(得分:0)

因为int的默认值是0。

所以行

this.a*=a;

相当于

0 * 20

等于0。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

答案 4 :(得分:0)

整数的初始值为0.您的实际分配是:

a = 0 * 20

始终返回0.

在声明字段时,并不总是需要分配值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或null,具体取决于数据类型。但是,依赖于这样的默认值通常被认为是糟糕的编程风格。