自从过去几天以来,我一直在混淆如何通过构造函数初始化实例属性。
考虑一下这个案例
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);
}
}
这是如何初始化的。我知道构造函数初始化一次值。可以多次分配。
答案 0 :(得分:3)
整数的初始值为0.您的实际分配是:
a = 0 * 20
始终返回0.
在声明字段时,并不总是需要分配值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或null,具体取决于数据类型。但是,依赖于这样的默认值通常被认为是糟糕的编程风格。
答案 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,具体取决于数据类型。但是,依赖于这样的默认值通常被认为是糟糕的编程风格。