static
关键字,用来修饰属性,方法,类,代码块
方法区中有静态常量池,首先加载,核心内库再将static类加载进去.
方法区中有静态区,将main方法加载到静态区,在静态区存储,静态static关键字修饰的变量只有一个地址,不管创建多少对象,不同对象保存的地址都是同一个,因此新创建的对象会覆盖上面的对象。
类加载后不会移除,直到整个程序运行到结果。
静态变量是随着类加载被加载到方法区的静态区当中,直到类被移除才会释放。
static修饰变量时的使用环境
1.如果每个对象的特征点不一样不适合
2.如果每个对象的特征值都一样,则可以使用static来进行修饰
3.一般情况下都是用类名来调用静态变量的
4.构造代码块中不可以定义静态变量(静态变量在类加载时就要初始化,构造代码块在创建对象时执行)
5.在构造方法中不可以定义静态变量,同上。
6.在构造代码块和构造方法中可以修改静态变量的值。
静态方法 static修饰的方法
生命周期 随着类加载而被加载到方法区的静态区中,被调用时才开始运行程序。
注意
1.静态方法中不能定义静态变量,因为类加载已经完成。程序还不执行。矛盾。
2.静态方法中不能够直接调用非静态方法。静态方法在加载类时就已经加载在方法区静态区,而非静态方法必须得通过new之后才能调用,也就是创建内存区之后运行,静态方法可以直接用类调用,二者矛盾。
3.静态方法中不能够使用super this 关键字。二者都是代表对象,静态中在类加载使用,不能够创建对象。
4.main方法中不能使用this和super关键字 因为它是静态方法。
5.静态方法可以进行方法重载
6.子类能继承父类的静态方法
7.静态方法不可以重写——因为类加载,静态方法的加载和类相关
静态代码块
static{//类在真正被使用时,会使用静态代码块,仅执行一次。
代码块;
}
class Person2{
String name;
int age;
static char gender;
public void eat() {
System.out.println("吃东西。。。。。。");
}
}
public class StaticDemo {
public static void main(String[] args) {
Person2 p = new Person2();
p.age = 10;
p.name = "胡哥哥";
p.gender = '男';
p.eat();
System.out.println(p.age +p.name+p.gender);
Person2 p1 = new Person2();
p1.age = 10;
p1.name = "胡姐姐";
p1.gender = '女';
p1.eat();
System.out.println(p1.age +p1.name+p1.gender);
System.out.println(p.age +p.name+p.gender);
}
}
运行结果
吃东西。。。。。。
10胡哥哥男
吃东西。。。。。。
10胡姐姐女
10胡哥哥女//注意static 修饰的变量被覆盖了