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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张权 中级黑马   /  2012-11-25 12:13  /  1671 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张权 于 2012-11-25 19:45 编辑

class Variable
{
                int x;
                Variable()
                {
                        int  x = 60;//这里打印结果,x =0 ,如果改成 x = 60,打印结果为60,为什么?最好能画图说明
                        System.out.println("haha");
                }        
}
class Test
{
                public static void main(String[] args)
                {
                                Variable v = new Variable();
                                System.out.println(v.x);
                }        
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
本帖最后由 孙浩 于 2012-11-25 12:28 编辑

class Variable
{
                int x;
                Variable()
                {
                        int  x = 60;//对象一经创建,便执行此句
                        System.out.println("haha");
                }        
}
class Test
{
                public static void main(String[] args)
                {
                                Variable v = new Variable();//创建对象时,Java虚拟机会自动调用无参的构造方法
System.out.println(v.x);
                }        
}

你创建了两个x,注意变量的作用域

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
孙浩 发表于 2012-11-25 12:17
class Variable
{
                int x;

这个我知道啊,可是为什么 构造函数
Variable()
{
      int x = 60;//与 x = 60打印的结果不一样啊?
}
回复 使用道具 举报
构造函数是对该类对象进行初始化,楼主把这理解了就清楚了

说明:   Main()函数进入栈内存,然后  是p,调用的实例成员进入堆内存,并后获得一个地址值传给了栈内存中的主函数,其nameage 初始化为null0,然后构造函数进入栈,对其进行初始化, 使s=wangwu a=29 通过主函数内的地址值传递给实例对象,使其赋值,然后构造函数弹栈,进行下一个函数的调用。

图片1.png (53.99 KB, 下载次数: 20)

图片1.png

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
你创建了两个x,注意变量的作用域
class Variable
{
                 int x;
                 Variable()
                 {
                         x = 60;//这样写应该是没有问题的
                         System.out.println("haha");
                 }        
}
class Test
{
                 public static void main(String[] args)
                 {
                                 Variable v = new Variable();
                                 System.out.println(v.x);
                 }        
}
回复 使用道具 举报
int  x=60;相当于在内存中又开辟了一块空间,这块空间的值就是60,一个新的x变量指向了这块内存;而x=60,是任然用之前的那个引用变量,只不过让这个变量重新指向了一块内存空间。所以如果x=60,而这个x的变量是在类中定义的,那么x的值就在类中有效;而int x=60,只是在构造函数中定义的,构造函数结束了,它也就over了,所以类中的那个x还是没有变,任然是0

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
张权 中级黑马 2012-11-25 12:58:51
7#
yingying 发表于 2012-11-25 12:32
int  x=60;相当于在内存中又开辟了一块空间,这块空间的值就是60,一个新的x变量指向了这块内存;而x=60, ...

你的意思是Variable v  = new Variable();这句话执行的是
Variable()
{
       int x = 60;
      
}这句话吧?执行完了,然后再  System.out.println(v.x)。但是这个时候构造函数已经执行完了,释放了内存,所以v.x其实就是调用的成员变量 x,而且v这个引用根本没法调用构造函数内部的x.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马