public class XueXi {
String mingZi;
static int nianLing;
public XueXi() {
System.out.println("构造函数");
}
{
System.out.println("我是代码块");
}
static {
System.out.println("我是静态代码块");
}
}
//个人这么理解:
XueXi myXueXi = new XueXi();
XueXi myXueXi2 = new XueXi();
程序运行时 当用 XueXi这个类 声明这个 myXueXi 变量时,
就会首先 加载XueXi类 在堆中 为XueXi类开辟一块空间,在开辟空间的这时,
对于 static 修饰符的 是属于这个类的 同时会运行一下static代码块,非static代码块不会运行 , 以为 static 修饰的 才是真正属于 类的;
所以这时会 打印出 System.out.println(“我是静态代码块”);
new XueXi(); 然后执行到这 会先在 堆中开辟一块空间 开辟空间的时候 为确定空间大小,会先执行一下 类里面代码
所以这时会 打印出 System.out.println(“我是代码块”);
new XueXi() 最后会 调用 构造函数
所以这时会 打印出 System.out.println(“构造函数”);
XueXi myXueXi2 = new XueXi();
当再一次 XueXi myXueXi2 的时候 因为之前 XueXi 类 已经有在 堆中开辟空间了 已经存在了 这时 就不会再为 XueXi 开辟了 所以这时 就不会再出现
System.out.println(“我是静态代码块”);
new XueXi(); 这是再创建一个 XueXi对象 所以会 再为新的XueX对象开辟一块空间
所以这时会 打印出 System.out.println(“我是代码块”);
然后 打印出 System.out.println(“构造函数”);
当 新new出来对象 要访问 类中的 静态成员 或是 静态方法时;
正确的代码是
XueXi.static属性 XueXi.static方法
而不是 myXueXi2 .static属性 myXueXi2 .static方法
因为 static修饰的 属性 方法 是属于类的 而不是属于对象
对象可以 myXueXi2 .static属性 myXueXi2 .static方法 去使用
但是 它最终 也是 去类的内存空间中 调用