static定义:
在Java中,static被定义为关键字,它用来修饰成员变量,方法,代码块,还有接口类中的常量和方法,它们定义的位置与执行的顺序也息息相关。
修饰成员变量:
用static修饰的变量就归属于类,它们共享一个内存空间,无论哪一个静态成员变量被修改,他们都指向那个被修改的空间,意思就是所有的静态成员变量都被修改,
例如:当p1.age被赋值21时,p2.age被修改为22,因为指向同一个内存空间,所以最后输出的结果都是22
public class Person {
static int age;
}
class Test{
public static void main(String[] args) {
Person p1=new Person();
p1.age=21;
Person p2=new Person();
p1.age=22;
System.out.println(p1.age);
System.out.println(p2.age);
}
}
修饰方法:
当一个方法被static修饰的时候,称为静态方法,当普通方法被调用时,需要创建实例对象,而被static修饰的方法,即使没有创建对象也可以用类名直接调用。
public class Person {
public static void dosth(){
System.out.println("Hello World");
}
}
class Test{
public static void main(String[] args) {
Person.dosth();
}
}
注意:静态方法在使用时,静态方法只能访问静态成员变量和静态方法,不能访问普通方法,而普通方法可以访问静态方法和静态变量。
代码块:
static修饰的代码块称为静态代码块,它在”类被加载“时运行,并且只运行一次,且优先于其他构造代码块和构造方法,如果一个类中有多个静态代码块时,则会按照顺序执行。
class Test{
static{
System.out.println("先执行这个静态代码块");
}
static {
System.out.println("再执行这个静态代码块");
}
public static void main(String[] args) {
}
}
运行结果:
修饰接口类中的常量和方法:
因为接口类是一种特殊的抽象类,不能定义实例的成员变量,但是可以定义静态的成员变量,使用final 和static 修饰成一个静态常量
interface AbsClass{
public static final int M=3;
}
接口类中也有静态方法,它在调用时用 接口类名可以直接调用
interface AbsClass{
static void dosth(){
}
}
class A{
public static void main(String[] args) {
AbsClass.dosth();
}
}
执行顺序:
先静态构造代码块 ---> 构造代码块 ---> 构造方法 ---> 普通方法,
如果代码中存在继承关系则:先父类静态代码块,再子类静态代码块,下来是父类的构造带码块和构造方法,最后是子类的构造代码块和构造方法。
目录