一、有什么作用
static表示静态的,存在于静态域中,用于修饰成员变量和成员函数,
当成员变量被static修饰后,可以用类名调用(类名.静态成员)。
二、特点
①随着类的加载而加载,随着类的消失而消失(生命周期最长)
②被所有对象所共享
③优先于对象存在
④可以直接被类名所调用
三、和实例变量(成员变量)的区别
①存在位置:类变量随着类的加载而存在于方法区;实例变量随着对象的建立而存在于堆内存中。
②生命周期:类变量生命周期最长,随着类的消失而消失;实例变量生命周期随着对象的消失而消失。
三、注意事项
①静态方法只能访问静态成员,非静态方法既可以访问静态,又可以访问非静态。
②静态方法中不可以定义this,super关键字(因为静态优先于对象存在)
四、静态代码块
①格式
static
{
//代码块
}
②注意:随着类的加载而执行,只执行一次,并优先于主函数,用于给类初始化。
五、案例
class StaticCodeDemo { static { System.out.println("这是StaticCodeDemo类中的静态代码块"); } public static void main(String[] args) { new StaticCode(); //类只加载一次,在new一个对象时与不会在执行static中的代码 new StaticCode(); System.out.println("OVER"); } static { System.out.println("这是StaticCodeDemo类中位于主函数下的静态代码块"); } } class StaticCode { //这是StaticCode类中的静态代码块 static { System.out.println("这是StaticCode类中的静态代码块"); } public StaticCode(){ { //这是StaticCode类中的构造代码块 System.out.println("这是StaticCode类中的构造代码块"); } System.out.println("这是StaticCode类中的构造函数"); } } 这是StaticCodeDemo类中的静态代码块 这是StaticCodeDemo类中位于主函数下的静态代码块 这是StaticCode类中的静态代码块 这是StaticCode类中的构造代码块 这是StaticCode类中的构造函数 这是StaticCode类中的构造代码块 这是StaticCode类中的构造函数 OVER
解释:
①当程序运行时,先将StaticCodeDemo类加载到内存中,同时会将静态代码块加载到静态域中给StaticCodeDemo类初始化,这时就有了第一二行的结果。
②然后在去执行主函数,当new StaticCode()时会将StaticCode类加载到内存中,并执行里面的静态代码块给StaticCode类初始化
这时就有了第三行的结果。
③执行完静态的后会去执行构造函数,执行构造函数时先执行构造代码块在执行其他的内容,这就有了第四五行的结果。
④当主函数中再次new StaticCode()时,StaticCode类中的静态代码块不会在加载,而只会调用构造函数给对象初始化,就有了第六七行的结果。
⑤主函数中执行代码输出OVER,程序结束。