看下面几种情况的代码:
- 第一种:
class A{
public static int na; // A中定义静态成员变量
}
class B extends A{ // B继承A,并且B中没有同名的变量
}
A.na = 3;
System.out.println(B.na); // 3
B b = new B();
b.na ++;
System.out.println(B.na); // 4
继承之后可以继承父类的静态成员变量。并且A.na \ a.na \ B.na \ b.na 代表的是同一个变量
- 第二种:
class A{
public static int na; // A中定义静态成员变量
}
class B extends A{
public int na; // B继承A之后,又自己定义同名的普通成员变量
}
A.na = 3;
A a = new A();
a.na++;
System.out.println(A.na); // 4
B b = new B();
System.out.println(b.na); // 4
由上面的代码可以看出,在B中,普通的成员变量na覆盖了从A中继承来的静态成员变量,要使用A中的静态成员na 只有用A.na 或者a.na两种方式,而B.na 编译器会认为是错误的,b.na表示的是B中的普通成员变量。
- 第三种
class A{
public static int na ;// A中定义静态成员变量
}
class B extends A{
public static int na; // B继承A之后又定义了自己的同名静态成员变量。
}
A.na = 3;
A a = new A();
a.na++;
System.out.println(A.na); // 4
B b = new B();
B.na = 10;
b.na++;
System.out.println(B.na); // 11
System.out.println(A.na); // 4
从上面的输出结果可以看出,B中的静态成员na会覆盖A中的静态成员,此时,A和B拥有完全不同的静态成员na。
总结:从上面的三种情况可以看出,静态变量既可以被子类继承,但继承之后,多个类共用的还是一个变量空间。还可以被子类覆盖。所以如果我们在使用的时候就需要特别注意这种情况。
为了规范代码,避免错误,关于静态成员,我们统一用类名的方式进行调用,并且,它是在哪个类中定义的就使用哪个类进行调用。完全把它当做全局函数使用。虽然这在一定程度上有违面向对象的观点,但它对于程序的正确运行、扩展有很大的帮助。