接下来主要都是关于Class的内容。
类成员初始化
在C++中,这样做是不行的:
class a
{
public:
int a = 0;//不能初始化 编译失败
}
但是在java中,这是完全可行的。
在C++中,如果:
int a;
你会发现a的值是不确定的。
但是在java中,a的值肯定是0,因为java会自动初始化这个值为0。
这是不是就意味着,在java里,int a = 0; 这样的做法是多余的?
只要int a;就可以了,因为变量会被自动赋值为0?
希望有知道的人可以解答一下,先谢过。
补充一个事:
变量作为类的属性的时候才会有编译器帮你初始化为0,因为在给类分配完空间后,分配的空间里的所有内容会被自动赋值为0;
如果是局部变量,还是需要自己手动初始化。
在java中,初始化方法还有一个“初始化块”,你完全可以在这个块里初始化,而不必在类的构造函数里。
另外,成员变量的初始化顺序是由定义的先后顺序决定的。比如:
class A
{
public int a = 1;//第一个初始化
public int b = 1;//第二个初始化
}
当一个类被实例化时,关于 类成员初始化的顺序,是这样的:
- 该类的所有static变量被自动初始化;
- static变量定义初始化以及static初始化块--这2个的初始化顺序是按照定义的先后顺序来的,如果块在前,定义在后,那么先块初始化,后定义初始化;
- 然后创建对象,分配存储空间,存储空间清零,设置默认值;
- 非static变量定义初始化以及非static初始化块--按照定义先后顺序;
- 构造函数初始化。
class A
{
public int a = 9; //7-自动初始化为0 10-初始化为指定的9
public int b = 0; //8-自动初始化为0 11-初始化为指定的0
{
a = 1; // 12
b = 2; // 13
c = 5; // 14
}
public int c = 3; //9-自动初始化为0 15-初始化为指定的3
public static int sa = 5; //1-自动初始化为0 3-初始化为指定的5
static {
sa = 2; // 4
sb = 7; // 5
}
public static int sb = 3; //2-自动初始化为0 6-初始化为指定的3
A()
{
a = 16; // 16
sb = 50; // 17
}
}
上面的程序,数字代表初始化顺序。最后各变量的值为:
sa = 2;
sb = 50;
a = 16;
b = 2;
c = 3;
sb = 50;
a = 16;
b = 2;
c = 3;
一个比较有趣事
java没有析构函数,这个和C++不同,因为java有内存回收机制。
但是java有一个函数,重载这个函数可以达到类似析构函数的效果,这个函数是:finalize。