C++初始化和java初始化的区别
关于类和由于之前一直是C++的观念,所以对java的初始化方面了解不多,因为在C++ ,非静态成员在定义时不能直接赋值初始化,只能在构造函数中进行初始化,而静态成员要在类外以定义的方式进行初始化。Java不同,java可以在类定义时直接对静态成员和非静态成员进行赋值初始化,当然也可以在构造方法中初始化。另外C++没用所谓初始化块的概念,因为初始化工作在构造函数中完成,java却有初始化块的概念,就是在类定义中用{}围起来的语句块。在语句块中可以对成员变量进行初始化赋值。初始化块可以分成静态初始化块和非静态初始化块,前者形式为static{},静态初始化块只能初始化静态成员,跟静态方法的访问权限一样。举个例子
public class InitTest
{
int a=0;//非静态成员
static int b=0;//静态成员
{a=10;}// 非静态初始化块
static {b=10;}// 静态初始化块
InitTest()//构造函数
{
a=20;
b=20;
}
public staticvoidmain(String[] args)
{
InitTest test=new InitTest();
System.out.println(test.a+" "+InitTest.b);
}
}
整个初始化的顺序是:
1.虚拟机加载类时,执行类的静态成员初始化赋值和静态初始化块,如果静态成员没用明显指定初始值则赋值0,静态对象成员赋值null。2.new出对象时,先执行类的非静态成员的赋值和非静态初始化块,如果非静态成员没用明显指定初始值则赋值0,非静态对象成员赋值null。注意一点,根据代码调试证明这种默认初始化发生在构造方法调用前。3.调用类的构造方法,需要注意的是和C++不同,java可以在构造方法内对静态成员进行赋值初始化。
--补充
根据测试发现静态初始化块只有在第一次new对象时调用一次,再次new新的对象不会再调用。