Java类成员变量分为普通成员变量,final成员变量和静态成员变量。

一 、对于普通成员变量的初始化,可以分为以下几种。

    1、在声明时赋值。例如 int x = 5;

    2、在代码块或者类方法中赋值。 例如:

          

class Test {
                  int x; //声明时没有赋值
                  {
                           x = 6; //在代码块中赋值
                    }
                    Test() {
                          x = 7; //在构造函数中赋值
                    }
                    private void method() {
                          x = 8; //在一般方法中赋值
                     }
           }

二 、 final成员变量

          1、和普通成员变量一样,在声明时赋值。 例如  final int x = 5;

          2、和普通成员变量一样,在代码块中、构造函数中赋值。但是不能在一般成员函数中赋值。

                 如果在代码块中赋值后,不能再在构造函数中赋值。这关系到java中代码执行顺序。

         

class Test {
                 final int x; //声明时没有赋值
               {
                           x = 6; //在代码块中赋值
                    }
                    Test() {
                          x = 7; //在构造函数中赋值
                    }
           }

         三种赋值方法必须选取一种,否则将会产生编译错误。

三 、 静态成员变量

         1、普通静态成员变量。 和普通成员变量类似,可以在声明时赋值,可以在静态代码块中赋值,也可以在静态方法中赋值,也可以在构造函数中赋值。

          2、final静态成员变量。赋值只能在声明时和静态代码块中。构造函数中不能对静态final变量赋值。


请看一个完整的例子。

         

public class Parent {
                     final static int x = 0;
                     final static int y;
                     final int z;
                     static {
                             System.out.println("Static code");
                              y = 5;
                             //z = 6; //Cannot make a static reference to the non-static field z
                      }
                      final int a;
                      {
                                  System.out.println("Dynamic code");
                                  a = 3;
                                  b = 4;
                                  //System.out.println("b = " + b); //Cannot reference a field before it is defined
                      }
                      final int b;
                      //final static int c; //The blank final field c may not have been initialized
                      Parent() {
                                z = 6;
                                //c = 6; //The final field Parent.c cannot be assigned
                                System.out.println("Constructor code");
                                System.out.println("x = "+ x);
                                System.out.println("y = "+ y);
                                System.out.println("z = "+ z);
                                System.out.println("a = "+ a);
                                System.out.println("b = "+ b);
                       }
                 }