静态成员包括静态数据成员和静态成员方法。
静态成员属于整个类而不是属于某个对象,它被该类的所有对象共享。
访问静态成员时一般通过类名访问,也可以通过对象访问。
静态成员也受访问权限的约束。
静态数据成员在使用之前应尽量初始化。
静态成员方法不能操作非静态成员。
静态成员方法没有this引用。
下面通过一个案例来深入体会静态变量和静态方法
父类:
public class A { //定义一个静态变量a static int a = 1; //定义一个静态变量b static int b = 2; /** * 静态成员方法printA() */ public static void printA(){ System.out.println("来自A中的a=" + a); } /** * 静态成员方法printB() */ public static void printB(){ System.out.println("来自A中的b=" + b); } }
子类:
public class B extends A { //定义一个静态成员变量a static int a = 3; //定义一个静态成员变量b static int b = 4; /** * 定义一个静态成员方法 */ public static void printB(){ System.out.println("来自B中的b=" + b); } }
测试类:
public class TestStatic { public static void main(String[] args) { //因为类B中没有定义printA()方法所以它会自动调用它父类的方法,输出1 B.printA(); //类B中定义了printB()方法,所以会调用类B中的printB(),输出4 B.printB(); //因为子类自己就有静态变量a,所以会调用B中的变量,输出3 System.out.println(B.a); } }
总结:
1.静态变量与静态方法说继承关系式不确切的,静态方法与静态变量是属于类的方法和变量。而子类也属于超类,比如说Faculty extends Person,则Faculty也是一个Person,所以子类能够调用父类的静态方法和变量。注意:此时子类调用的其实就是超类的静态方法和变量,而不是继承自超类的静态方法和变量。但是如果子类中有同名的静态方法与变量,这时候调用的就是子类本身的。因为子类的静态变量和静态方法会隐藏父类的静态方法和变量。
2.如果子类中没有定义同名的变量和方法,那么调用"子类名.静态方法/变量"其实调用的就是父类的方法和变量。
3.如果子类中自定义了同名的静态变量,而没有定义与父类同名静态方法,则调用"子类名.静态方法"时,会调用父类的静态方法,静态变量中的静态变量也是父类的,如上述程序中的B.printA();其实调用的是父类的printA()方法,方法中的变量也是父类的。
4.如果子类中已经定义了与父类同名的静态变量,也定义了与父类同名的静态方法,这时候调用"子类名.静态方法"时,完全与父类无关,里面的静态变量也是子类的,如上述程序中的B.printB();