一文讲清楚 static 关键字
static 能修饰的地方
静态变量
静态变量: 又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它;静态变量在内存中只存在一份。
实例变量: 每创建一个实例就会产生一个实例变量,它与该实例同生共死。
静态方法
静态方法在类加载的时候就存在了,它不依赖于任何实例。所以静态方法必须有实现,也就是说它不能是抽象方法(abstract)。
只能访问所属类的静态字段和静态方法,方法中不能有 this 和 super 关键字。
静态语句块
静态语句块在类初始化时运行一次。
静态内部类
非静态内部类依赖于外部类的实例,而静态内部类不需要。
静态内部类不能访问外部类的非静态的变量和方法。
静态导包
在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。
初始化顺序
静态属性,静态代码块。
普通属性,普通代码块。
构造方法。
静态方法和变量能否被继承
先说结论:能
父类 A:
子类 B:
子类 C:
测试:
注意
静态变量尤其要注意并发问题。因为静态变量在 Java 中是类级别的变量,它们被所有类的实例共享。由于静态变量是共享资源,当多个线程同时访问和修改静态变量时,就会引发并发问题。
总结
子类会继承父类的静态方法和静态变量,但是无法对静态方法进行重写
子类中可以直接调用父类的静态方法和静态变量
子类可以直接修改(如果父类中没有将静态变量设为 private)静态变量,但这是子类自己的静态变量。
子类可以拥有和父类同名的,同参数的静态方法,但是这并不是对父类静态方法的重写,是子类自己的静态方法,子类只是把父类的静态方法隐藏了。
当父类的引用指向子类时,使用对象调用静态方法或者静态变量,是调用的父类中的静态方法或者变量(这比较好理解,因为静态方法或变量是属于类的,而引用指向的是一个对象,对象中并不会包含静态的方法和属性)。也就是说,失去了多态。
当子类的引用指向子类时,使用对象调用静态方法或者静态变量,就是调用的子类中自己的的静态方法或者变量了。
文章转载自:Seven
评论