静态类和方法什么时候被装载? 是程序运行时就已经有了吗,不论是否会创建这个类的对象?如果class Test{ public static int test=1;}是不是程序一运行,内存中就已经有一个为一的test了呢还是当第一次创建对象时,才会有 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Test t = null;的时候就会有了 出一个例子:class Insect {//1) int i = 9; int j;//2) Insect() { prt("i = " + i + ", j = " + j); //类Insect的构造函数Insect()就用到了i ,j;这里i输出来的结果应该是9 ; j = 39; }//3) static int x1 = prt("static Insect.x1 initialized"); static int prt(String s) { System.out.println(s); return 47; }}//Beetle是Insect的子类public class Beetle extends Insect {//4) int k = prt("Beetle.k initialized");//5) Beetle() { prt("k = " + k); prt("j = " + j); }//6) static int x2 = prt("static Beetle.x2 initialized"); static int prt(String s) { System.out.println(s); return 63; } public static void main(String[] args) { prt("Beetle constructor"); Beetle b = new Beetle(); }}上面这个例子还包括了一个子类一个父类,相对初始化装载的时候稍微有点麻烦一点,但是总体原则是一样的。根据我的编号,装载的顺序是:3、6、1、2、4、5。当在装载Beetle类的时候,先去找Beetle.class把他装载进来,在Beetle.class装载到一半的时候,发现他还有个父类Insect.class,那么需要把Insect.class也装载进来,并且先对他进行初始化,那么(3)是最先被初始化的,接下来父类装载完毕之后,子类接着也装载进来,这样,(6)接着被初始化。new Beetle()的时候,先分配内存,接着父类的非静态初始化,然后父类构造函数,所以(1)(2)陆续初始化,接着是子类(4)(5)。基本上初始化的顺序是先父类后子类,先静态,后非静态,最后才是构造函数。 在你把test装载的时候就分配好了test变量的内存 创建一个对象,或者是类.class的时候就会加载静态的数据。 只要涉及到这个类就会运行里面的static的代码或者对象了。 静态域的初始化发生在其所在类或接口被初始化的时候类和接口T会在以下情况下被初始化:• T是一个类,并且它的一个实例被创建 • T是一个类,并且它的一个静态方法被执行 • T的一个非常量静态域被使用或赋值(就是非static final修饰的域) • 没有用反射包中的方法执行和T有关的操作(比如Class.forName()) java线程同步问题 「求助高手」获取url资源的真实文件名和后缀 javascript对象创建与传递的迷惑 求助,如何 识别 全角英文(字符) ? java新手输入小问题? 为什么装载不了图片??? ImagePanel 认证模拟。 数组能不能动态改变大小? 谁??可以提供JAVA源程序给我啊 这个float加法运算是怎么回事啊 关于main的一个问题
的时候就会有了
class Insect {
//1) int i = 9;
int j;
//2) Insect() {
prt("i = " + i + ", j = " + j); //类Insect的构造函数Insect()就用到了i ,j;这里i输出来的结果应该是9 ;
j = 39;
}
//3) static int x1 = prt("static Insect.x1 initialized");
static int prt(String s) {
System.out.println(s);
return 47;
}
}
//Beetle是Insect的子类public class Beetle extends Insect {
//4) int k = prt("Beetle.k initialized");
//5) Beetle() {
prt("k = " + k);
prt("j = " + j);
}
//6) static int x2 = prt("static Beetle.x2 initialized");
static int prt(String s) {
System.out.println(s);
return 63;
}
public static void main(String[] args) {
prt("Beetle constructor");
Beetle b = new Beetle();
}
}上面这个例子还包括了一个子类一个父类,相对初始化装载的时候稍微有点麻烦一点,但是总体原则是一样的。根据我的编号,装载的顺序是:3、6、1、2、4、5。当在装载Beetle类的时候,先去找Beetle.class把他装载进来,在Beetle.class装载到一半的时候,发现他还有个父类Insect.class,那么需要把Insect.class也装载进来,并且先对他进行初始化,那么(3)是最先被初始化的,接下来父类装载完毕之后,子类接着也装载进来,这样,(6)接着被初始化。new Beetle()的时候,先分配内存,接着父类的非静态初始化,然后父类构造函数,所以(1)(2)陆续初始化,接着是子类(4)(5)。基本上初始化的顺序是先父类后子类,先静态,后非静态,最后才是构造函数。
• T是一个类,并且它的一个实例被创建
• T是一个类,并且它的一个静态方法被执行
• T的一个非常量静态域被使用或赋值(就是非static final修饰的域)
• 没有用反射包中的方法执行和T有关的操作(比如Class.forName())