黑马程序员技术交流社区

标题: 关于构造函数的疑问 [打印本页]

作者: 张权    时间: 2012-11-25 12:13
标题: 关于构造函数的疑问
本帖最后由 张权 于 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);
                }        
}
作者: 孙浩    时间: 2012-11-25 12:17
本帖最后由 孙浩 于 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,注意变量的作用域

作者: 张权    时间: 2012-11-25 12:21
孙浩 发表于 2012-11-25 12:17
class Variable
{
                int x;

这个我知道啊,可是为什么 构造函数
Variable()
{
      int x = 60;//与 x = 60打印的结果不一样啊?
}
作者: 齐银春    时间: 2012-11-25 12:28
构造函数是对该类对象进行初始化,楼主把这理解了就清楚了

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

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

图片1.png

作者: 孙浩    时间: 2012-11-25 12:30
你创建了两个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);
                 }        
}

作者: yingying    时间: 2012-11-25 12:32
int  x=60;相当于在内存中又开辟了一块空间,这块空间的值就是60,一个新的x变量指向了这块内存;而x=60,是任然用之前的那个引用变量,只不过让这个变量重新指向了一块内存空间。所以如果x=60,而这个x的变量是在类中定义的,那么x的值就在类中有效;而int x=60,只是在构造函数中定义的,构造函数结束了,它也就over了,所以类中的那个x还是没有变,任然是0

作者: 张权    时间: 2012-11-25 12:58
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.




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