A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 瞿乐 于 2012-8-3 23:45 编辑

public class Demo1 {
        {
                x = 1;
        }
        public static int x = 2;
        static {
                x = 3;
        }

        public static void main(String[] args) {
                System.out.println(Demo1.x + new Demo1().x);
                System.out.println(Demo1.x + new Demo1().x);
        }
}
运行结果为什么是4,2??
头晕了,不知道内存中是怎么分配的,求解答,有内存图就更好了

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
答:运行结果为 4 ,2
分析: 静态成员和静态代码块随类的加载而加载
执行Demo1.x这句: 没有类的实例对象进来,也new Demo1().x

执行Demo1.x这句: 没有类的实例对象进来,也
就没有什么对象初始化,因此只执行public static int x = 2;
static{
x = 3;
}
这两句,这时候x的值是3
执行new Demo1().x ,就在原来的基础上进行上进行对象的初始化语句,即执行{
x = 1;
}
这时候 x的值是1,两个x相加为4
执行下面的System.out.println( Demo1.x + new Demo1().x );
这时候,类还在运行,不需要加载,也就是说执行Demo1.x的时候,x的值还是1,执行了
new Demo1().x也是1,两个x的相加和为2

希望能帮到你
明白了吗

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
林康春 发表于 2012-8-3 23:12
答:运行结果为 4 ,2
分析: 静态成员和静态代码块随类的加载而加载
执行Demo1.x这句: 没有类的实例对象进 ...

静态成员和静态代码块随类的加载而加载
如果同时存在呢?会怎么加载?按顺序吗?还有初始化,这个顺序是怎么样的?
回复 使用道具 举报
静态成员和静态代码块随类的加载而加载 但仅仅加载一次 所以这时候 x被赋值为3  始终就是3啦  加载完类创建对象demo1().x的值为1
Demo1.x为3  而Demo1().x为1 ; 所以Demo1.x + new Demo1().x的结果为4 而Demo1.x + new Demo1().x结果为1
回复 使用道具 举报
瞿乐 发表于 2012-8-3 23:23
静态成员和静态代码块随类的加载而加载
如果同时存在呢?会怎么加载?按顺序吗?还有初始化,这个顺序是 ...

静态成员和静态代码块随类的加载而加载,如果都存在,则按顺序执行
初始化则跟随进行默认初始化
有new对象后则进行实例对象的初始化

回复 使用道具 举报
嗯,  问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马