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)
    {
test=new InitTest();
       System.out.println(test.a+" "+InitTest.b);
    }
}

整个初始化的顺序是:

1.虚拟机加载类时,执行类的静态成员初始化赋值和静态初始化块,如果静态成员没用明显指定初始值则赋值0,静态对象成员赋值null。2.new出对象时,先执行类的非静态成员的赋值和非静态初始化块,如果非静态成员没用明显指定初始值则赋值0,非静态对象成员赋值null。注意一点,根据代码调试证明这种默认初始化发生在构造方法调用前。3.调用类的构造方法,需要注意的是和C++不同,java可以在构造方法内对静态成员进行赋值初始化。


--补充

根据测试发现静态初始化块只有在第一次new对象时调用一次,再次new新的对象不会再调用。