一、创建一个类的对象时(new 类名)时,该类的.class文件会被加载到一段内存中。
1.先将该类的.class文件会被加载到一段内存,初始化static属性和方法,为他们分配空间,以后一直在内存中,即使这个对象被销毁。(这就是不建议使用static属性和方法的原因之一)
2.copy其中非static属性和方法,为他们初始化,分配空间,然后才可以使用,因为非static的属性和方法是跟随对象的,所以当对象被回收时,属于该对象的属性和方法也被回收,再new的时候再生成。
二、执行某类的静态方法时(类名.方法名),该类不会被加载到内存中,也不会自动调用构造方法(构造 方法只在实例化的时候才调用),既然没有创建对象就不会存在对象的内存地址,得出结论类中的静态变量和静态方法的地址是单独的,和类的对象没关系。
public class t1 {
public static String str0 = "str0";
public static String str1 = "str1";
public t1() {
System.out.println("类被实例化");
}
public static void printf(){
System.out.println("print some thing...");
}
/**
* 调用T1.str0 T1.printf() 都不会调用构造函数。
*/
}
类中得静态变量和静态方法在整个程序结束时按序销毁,类的静态变量属于全局,在整个应用程序都可以使用。
静态方法也和静态变量一样占用内存吗?
不管是静态方法还是实例方法,方法最终在运行时都只占用一份内存,因为它保存的是程序的代码,只有类的数据才会有 多份。
方法静态动态都是个字节码,占的内存都差不多;真正占内存的是对象(主要是属性字段),特别是在静态成员上定义的 是一个集合,然后又往里面放很多东西的话。因为这样的内存不会被主动释放。