static 修饰属性(类变量):
1.由类创对象建的所有对象,都共有这个属性
2.当其中一个对象对此属性进行修改,会导致其他对象对此属性的调用
3.类变量随着类的加载而加载,而且独一份
4.类变量的加载是早于对象
5.静态的变量可以直接通过“类.类变量”的形式来调用(例如:person.nation),但是“类.实例变量是不可以的”
6.静态变量存在于静态域中
类的初始化顺序:静态变量 静态块 成员变量 实例块 构造方法
接下来我们举例说明一下:
我们将Person的nation属性用static来修饰,程序运行结果如下:
public class Test2 {
public static void main(String[] args) {
Person p1 = new Person("小花",18);
Person p2 = new Person("小草",19);
//p1.nation="china";
System.out.println(p1);
System.out.println(p2);
}
static class Person {
//实例变量
String name;
int age;
//静态变量
static String nation;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", nation='" + nation + '\'' +
'}';
}
}
}
此时默认p1、p2的属性为null
当我们在测试函数中对p1的nation属性改为china时,即 p1.nation=“china”;运行结果如下:
static修饰方法(类方法):
1.随着类的加载而加载,在内存中独一份
2.可以直接通过“类.类方法”的方式调用
3.在内部可以调用静态的属性或者静态的方法,而不能调用非静态的属性或方法。反之非静态的方法是可以调用静态的属性或者方法
4.静态的方法中不可以有this或者super关键字
注:静态的结构(static的属性、方法、代码块、内部类的声明周期早于非静态的,同时被回收也晚于非静态的)
public void show(){
System.out.println("age"+this.age);
System.out.println("nation"+nation);//可以调用,此时,静态方法及属性已经初始化完成
}
public static void show1(){
System.out.println("nation"+nation);
// System.out.println("age"+this.age); 错误 ,静态方法先初始话,此时实例方法还没有进行初始化
//this.show();不可以,this表示当前对象,此时还没有对象
}