static关键字可修饰:
1、属性
2、方法
3、代码块
4、类
a)修饰属性
Java静态属性和类相关, 和具体的实例无关. 换句话说, 同一个类的不同实例共用同一个静态属性。
class TestDemo{
public int a;
public static int count;
}
public class Main{
public static void main(String[] args) {
TestDemo t1 = new TestDemo();
t1.a++;
TestDemo.count++;
System.out.println(t1.a);
System.out.println(TestDemo.count);
System.out.println("============");
TestDemo t2 = new TestDemo();
t2.a++;
TestDemo.count++;
System.out.println(t2.a);
System.out.println(TestDemo.count);
}
}
输出结果为:
1
1
============
1
2
b)修饰方法
- 静态方法属于类,而不属于类的对象。
- 可以直接调用动态方法,无需创建类的实例。
- 静态方法可以访问静态数据成员,可以更改静态数据成员的值。
- 不可以访问非静态数据成员或调用非静态方法。
- this和super两个关键字不能在静态上下文中使用。
- main方法为static方法。
class TestDemo{
public int a;
public static int count;
public static void change() {
count = 100;
//a = 10; error 不可以访问非静态数据成员
}
}
public class Main{
public static void main(String[] args) {
TestDemo.change();//无需创建实例对象 就可以调用
System.out.println(TestDemo.count);
}
}
输出结果:
100
c)静态代码块
使用static定义的代码块。一般用于初始化静态成员属性。
- 静态代码块不管生成多少个对象,其只会执行一次,且是最先执行的。
- 执行顺序: 静态代码块->实例代码块删除线格式 (构造块)->构造函数
d)修饰类
1、获取静态内部类的对象:外部类类名.内部类类名 变量 = new 外部类类名.内部类类名();
2、静态内部类不能访问外部类的非静态数据成员, 如果非要访问,传入外部类对象的引用。
3、 静态内部类,不拥有外部类的this。