static 可以修饰变量和方法。被修饰的变量是静态变量,被修饰的方法为静态方法。
格式:
修饰变量:static 数据类型 变量名
修饰方法:【访问权限修饰符】 static 方法返回值 方法名(参数列表)
特点:
1. 被 static 修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所分享。
2. 在类被加载的时候,就会去加载被 static 修饰的部分。
3. 被 static 修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即使没有创建对象,也可以去访问。访问方法为:类名.静态变量 和 类名.静态方法
总结:
1. 在静态方法中没有 this 关键字,因为静态方法是随着类的加载而加载,而 this 是随着对象的创建而存在的。静态比对象优先存在。
2. 静态可以访问静态的,但是静态的不能访问非静态的。
3. 非静态的可以访问非静态的,也可以访问静态的。
具体例子:
public class Student {
private static int age; // 静态的变量
private double score; // 非静态的变量
public void run() {} // 非静态的方法
public static void go() {} // 静态的方法
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(s1.age);
System.out.println(s1.score);
System.out.println(Student.age);
// 不是静态变量,不可以直接调用
// System.out.println(Student.score);
// 不是静态方法,不能直接调用
// Student.run();
new Student().run();
Student.go();
// 也可以直接调用静态方法
go();
// 非静态方法可以调用静态方法,也可以调用非静态方法
// 静态方法只能调用静态方法
// 因为静态方法和类一起加载,而非静态方法需要类实例化后才存在。
}
}
看看类加载时以及实例化时执行顺序:
public class Person {
// 可以赋初始值
{
System.out.println("匿名代码块");
}
// 只在类加载的时候,执行一次
static {
System.out.println("静态代码块");
}
public Person() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Person person1 = new Person();
System.out.println("===============");
Person person2 = new Person();
}
}
运行结果:
静态导入包(一般不这么用)
// 静态导入包
import static java.lang.Math.random;
import static java.lang.Math.PI;
public class Test {
public static void main(String[] args) {
System.out.println(random());
System.out.println(PI);
}
}
注意:被 final 修饰的类不能被继承,相当于“断子绝孙”。