// 用静态变量,它是依赖类存在而存在的,在方法区的静态区,而成员变量则是依赖对象存在而存在,是对象变量,存储在堆内存。还有就是static方法中不能用非static全局变量,可以有局部变量。
//静态方法在类加载时就会加载到静态区,为其分配固定的内存空间,当调用它时加载到栈内存,直到程序结束时销毁。非静态方法则是调用完就销毁
//用static修饰的变量是全局变量,只能修饰全局变量,且static变量不能在方法中定义。
// 实例变量在类实例化对象时候创建,在对象销毁的时候销毁。
//静态方法在类加载时就会加载到静态区,为其分配固定的内存空间,当调用它时加载到栈内存,直到程序结束时销毁。非静态方法则是调用完就销毁
//用static修饰的变量是全局变量,只能修饰全局变量,且static变量不能在方法中定义。
//静态代码块,用于初始化数据的,只有当类加载的时候运行一次,并且只会运行一次,因为类加载只会加载一次。静态代码块里面的变量是静态变量,对该类的所有对象共享。非静态代码块的静态变量和成员变量的数据不会被该类所有对象共享,但是该类的所有对象还是共用这个静态变量,只不过因为有非静态代码块每次new对象之前都会对静态变量和成员变量初始化赋值。如下面代码
public class A {
public static int a;
{
a=10;
}
public void a(){
System.out.println(a);
}
}
class B{
public static void main(String[] args) {
A a=new A();
a.a = 100;
a.a(); //100
A aa=new A();
aa.a(); //10
}
}
public class A {
public static int a;
<span style="color:#ff0000;">static</span> {
a=10;
}
public void a(){
System.out.println(a);
}
}
class B{
public static void main(String[] args) {
A a=new A();
a.a = 100;
a.a();//100
A aa=new A();
aa.a();//100
}
}
静态方法是被调用的时候才执行的.(如果一个类第一次调用该类的静态方法,那么类加载时候会为其静态变量和静态方法分配内存空间和调用该方法,如果是第一次调用该类的静态变量,那么类加载时候会为其静态变量和静态方法分配内存空间和调用该静态变量,不会调用该类的静态方法),如果该类中已经为静态变量赋值,那么类加载时候会为静态变量进行显示初始化进行赋值。
// 实例变量在类实例化对象时候创建,在对象销毁的时候销毁。
// 局部变量在局部范围使用时创建,跳出局部范围销毁。
// 在第一次创建一个类的对象或者第一次调用一个类的静态属性和方法的时候,会发生类加载,类加载的时候就是为静态变量在静态区分配内存空间,一个类在一个程序开始到结束只会加载一次,比较两个类的字节码文件是否相同应用==号,因为它们都分别只有一份,比较地址值用==,比较内容用equals。
//方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。