数据成员可以分为静态变量和非静态变量两种。
  静态成员(Java中也称为类成员):静态类中的成员加入static修饰符,即是静态成员。可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员。因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员。

  非静态成员(Java中也称为对象成员):所有没有加static的成员都是非静态成员,当类被实例化之后。可以通过实例化的类名进行访问。非静态成员的生存期决定于该类的生存期。而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中。

        静态成员需要定义(不仅仅是在类中声明)来分配内存,定义的表现形式就是初始化。

 

(1)C++的静态成员变量只能在类外初始化,但常量静态成员可以在类内直接初始化;而Java则对可以在类内直接初始化或者使用静态初始化块。e.g.

// C++
class A{
    public:
      static int a;
      const int b = 0;    // 常量静态成员初始化
};

int A::a = 0;    // 静态成员变量初始化
// Java
class A{
    public static int a = 0;	// 直接初始化
	
    static {
        a = 0;	// 使用初始化块初始化
    }
}

 

(2)Java的静态成员变量可以默认初始化,而C++不可以。e.g.

// Java
public class Main {
    public static void main(String[] args) {
        System.out.println(A.a);
    }
}

class A{
    public static int a;
}

运行结果:0

// C++
class A{
    public:
      static int a;
};

int main(){
    cout << A::a << endl;
}

报错信息:undefined reference to `A::a'

注:布尔型默认初始化为false,字符型默认初始化为 '\0',数值型默认初始化为0或0.0,包装类与String默认初始化为null。

// Java
static boolean bool; static char c; static byte b; static short s; static int i; static long l; static float f; static double d;
static Boolean Bool; static Character C; static Byte B; static Short S; static Integer I; static Long L; static Float F; static Double D; static String Str;
	
public static void main(String[] args) {
    System.out.println(bool + " " + (c - '\0') + " " + b + " " + s + " " + i + " " + l + " " + f + " " + d);
    System.out.println(Bool + " " + C + " " + B + " " + S + " " + I + " " + L + " " + F + " " + D + " " + Str);
}

运行结果:

false 0 0 0 0 0 0.0 0.0
null null null null null null null null null

 

(3)另外附带说明一下,Java的方法中定义的局部变量是不会默认初始化的,但C++可以。e.g.

// Java
public static void main(String[] args) {
    String s;		
    System.out.print("s=" + s);
}

报错信息:局部变量 s 可能未初始化。

// C++
int main(){
    string s;
    cout << "s=" << s << endl;
}

运行结果:s=

 

(4)Java的类对象实例可以调用静态变量,但C++不可以。

// Java
public class Test {
	public static void main(String[]args)throws Exception {
	    A a1 = new A();
	    a1.a++;
	    System.out.print(A.a);
	}
}

class A{
	public static int a = 1;
}

运行结果:2

// C++
class A{
    public:
        static int a;
};

int A::a = 1;

int main(){
    A a1();
    a1.a++;
    cout << A::a << endl;
    return 0;
}

报错信息:

error: request for member 'a' in 'a1', which is of non-class type 'A()'

a1.a++;

^