class Loo{
int a;
static int b;
Loo(){
a++;
b++;
}
void show(){
System.out.println("a="+a);
System.out.println("b="+b);
}
}
public static void main(String[] args) {
Loo o1=new Loo();
o1.show();
Loo o2=new Loo();
o2.show();
}
为什么 两次的b值不一样,两次的a值是一样的?
求讲解static{}方法。
static修饰变量为静态变量,内存中只有一份所有实例对象共享此变量,类加载时进行初始化。所以第一次创建o1时调用b++,b=1;创建o2时更新此变量b=1,
再次调用构造方法b++,b=2.而a作为成员变量,是属于具体的某个实例的,每次创建都会进行初始化。
static{},为静态代码块。类加载时执行,先于构造方法。执行顺序按照静态代码块顺序
楼上说得很清楚了,我补充一下,用静态声明的方法或变量可以理解为是类的一部分,一般的方法是调用时加载的,而静态方法是预先就加载好的,这也是为什么main方法是静态的原因。另外,静态方法可以由类名直接调用。
设成静态变量的b,被 o1 和 o2 共用 ,所以b加了2次。
类的代码,静态变量,常量等存放在方法区(堆内存)。对象是以类为模板创建,存放在堆内存方法去区外的堆内存中,类有的信息她基本都有,
用static修饰的:我们通常不总是在叫类属性类方法是属于类的不属于某个对象。对象信息的声明周期,比如:int a;随对象创建使用销毁一起结束。静态变量:static int b;是属于类的所有对象共享。Loo o1=new Loo(); o1.show(); 之后o1.a 就销毁了。 --------其实不管方法、属性都是放在内存地址中的,你分析一下,她们的生命周期,一切都白了。