数据成员可以分为静态变量和非静态变量两种。
静态成员(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++;
^