黑马程序员技术交流社区

标题: 类被加载的时候一定会初始化静态变量吗??? [打印本页]

作者: aohn1117    时间: 2016-2-8 15:28
标题: 类被加载的时候一定会初始化静态变量吗???
class HaHa {
    static final int a= 1;
    static int b = 2;
    final int  c = 3;
}
1.调用a的时候类会加载进内存吗?
2.a位于内存的哪个地方???
3.b位于类的静态区中吗?
4.c位于堆中吗?
5.class.forName(HaHa)会执行静态初始化 ,HaHa.class就不会,为什么?


作者: ios_Beginner    时间: 2016-2-10 10:48
不太懂,顶一个吧
作者: Hi大智    时间: 2016-2-10 13:55
调用a类会加载到内存
a位于静态常量区
b位于静态区
c位于常量区

作者: boboyuwu    时间: 2016-2-11 17:33

class HaHa {
    static final int a= 1;
    static int b = 2;
    final int  c = 3;
}
1.调用a的时候类会加载进内存吗?             会
2.a位于内存的哪个地方???                  在静态区中
3.b位于类的静态区中吗?                 对
4.c位于堆中吗?               对,c不允许被二次赋值了。
5.class.forName(HaHa)会执行静态初始化 ,HaHa.class就不会,为什么?        因为class.forName(HaHa)把类加载进内存了,而HaHa.class就没有进内存
作者: 一念执着漂流    时间: 2016-2-18 12:31
对啊。。。。。。。
作者: wusiyi    时间: 2016-2-18 13:31
1.肯定会,要不然怎么类名调用?
作者: wusiyi    时间: 2016-2-18 13:35
2.应该是静态池
作者: wusiyi    时间: 2016-2-18 13:37
3.我觉得是的,老师画图是那么画
作者: cjwhale    时间: 2016-2-21 20:06
1.调用a的时候类会加载进内存吗? 会的.
2.a位于内存的哪个地方??? 不清楚
3.b位于类的静态区中吗? 是的
4.c位于堆中吗? 是的
5.class.forName(HaHa)会执行静态初始化 ,HaHa.class就不会,为什么? 类字面常量直接获得class对象引用, 不会初始化, 至于为什么还不知道.
作者: yindalei00    时间: 2016-2-24 23:37
你编译能过吗
作者: 赵雄    时间: 2016-2-25 12:08
class HaHa {
    static final int a= 1;
    static int b = 2;
    final int  c = 3;
}
1.调用a的时候类会加载进内存吗?             会
2.a位于内存的哪个地方???                  在静态区中
3.b位于类的静态区中吗?               ststic  对
4.c位于堆中吗?               对    final修饰
5.class.forName(HaHa)会执行静态初始化 ,HaHa.class就不会,为什么?        因为class.forName(HaHa)把类加载进内存了,而HaHa.class就没有进内存
作者: 张金金金    时间: 2016-2-25 23:20
看了之后觉得自己看的java基础算是白看了。。。好多不懂。。。
作者: 18210530167    时间: 2016-2-27 23:26
1、static的成员是随着类的加载而加载,所以调用a的时候类肯定也近了内存,而且a只能由类调用;2、a位于堆内存中,因为静态类在堆内存中 3、b和a一样 4、c是类的成员,类在堆内存中,所以c也在堆内存中;5、这个我不会。。请前辈指教
作者: 18210530167    时间: 2016-2-29 23:09
class 本身就是静态的,所以静态成员和类一起加载
作者: tsldxszd    时间: 2016-3-6 19:00
本帖最后由 tsldxszd 于 2016-3-6 23:50 编辑

调用a的时候类会加载进内存吗?会,主动调用就会加载,但没有实例化。
2.a位于内存的哪个地方???a加了final的属性是一个value,而不是一个field,位于常量池。调用它不会导致类的初始化,这一点你可以做个实验,但它同时又加了
static,那么这个a应该在字节码文件 里,属于方法区也说 的过去,因为可以用静态 的 方法调用a。我更倾向于方法区里有个变量a指向了常量池中的 地址。
3.b位于类的静态区中吗?位于 方法区,也就是静态区,调用会初始化类
4.c位于堆中吗?c位于常量池,在堆中类的 对象的属性里 有一个c属性指向常量池中c的内存地址。
5.class.forName(HaHa)会执行静态初始化 ,HaHa.class就不会,为什么?因为它还没有显示的加载,类的加载虚拟机并没有强制约束,尤其自由把握,但是有那么几种情况,类如还没初始化,会立即进行初始化,既没有访问类变量,创建实例,访问类静态方法,也没有反射类的字节码文件,被动调用不会初始化类
作者: gaoduilaile    时间: 2016-3-12 23:26
1 ,调用a时 类会加载进内存 生成HaHa.class文件
2,a位于内存的方法去中的静态区
3,b也在静态去
4,xxx.class 表示已加载过了,当类加载时,静态代码只执行一次,
作者: gaoduilaile    时间: 2016-3-12 23:35
1,调用类中的 任何东西 类都会加载进内存,类要先加载进内存,才能执行类中的语句,2,a位于方法区的静态区.3,b也是在静态区.4,c在堆中.5,xxx.class 文件表示已经被加载过了,静态代码块只执行一次
作者: gaoduilaile    时间: 2016-3-12 23:42
1,会,调用类中的任何方法和成员变量 ,类都会先加载进内存,然后才能执行类中的语句  
2,a位于内存的静态区
3,b和a一样位于静态区
4,c位于堆中
5,xxx.class 文件表示类已经加载过了,静态代码块 只执行一次,下一次加载类时就不执行了
作者: 1620698398    时间: 2016-3-27 11:57
1,调用a的时候会类会加载内存,
2,位于方法区的静态区
3,b位于静态区
4,c不位于堆中,因为被final修饰为常量,位于方法去的常量池
5一个是类,一个是字节码文件,静态变量属于类所以会随着类的加载而加载




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2