java 中 static问题,并讲解静态块

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 就销毁了。 --------其实不管方法、属性都是放在内存地址中的,你分析一下,她们的生命周期,一切都白了。