Java中的static变量、方法、代码块
1、static变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
2、static方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
3、static代码块
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
class StaticSuper
{
static String country="SuperClass";
{
System.out.println("Class StaticSuper block is loading!"); //(5)
}
static
{
//country = "china";
System.out.println("Class StaticSuper static block is loading!"); //(3)
}
StaticSuper()
{
System.out.println(country); //(6)
}
void ShowMe()
{
System.out.println(country);
}
}
class StaticSub extends StaticSuper
{
static String country2="StaticSub String";
{
System.out.println("Class StaticSub block is loading!");//(7)
}
static
{
System.out.println("Class StaticSub static block is loading!"); //(4)
}
StaticSub()
{
System.out.println(country2); //(8)
}
void ShowMe()
{
System.out.println(country2);
}
}
class test
{
static
{
System.out.println("Class test is loading!");//(1)
}
public static void main(String [] args)
{
System.out.println("Begin executing main method!");//(2)
//StaticCode st1=new StaticCode();
StaticSuper st=new StaticSub();
st.ShowMe();//(9)
}
}
结果:
Class test is loading!
Begin executing main method!
Class StaticSuper static block is loading!
Class StaticSub static block is loading!
Class StaticSuper block is loading!
SuperClass
Class StaticSub block is loading!
StaticSub String
StaticSub String
说明:类的执行顺序是:
父类静态代码 → 子类静态代码 → 父类非静态代码块 → 父类构造 → 子类非静态代码块 → 子类构造
分别对应(3)(4)(5)(6)(7)(8)