黑马程序员技术交流社区
标题: 关于构造函数的疑问 [打印本页]
作者: 张权 时间: 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,调用的实例成员进入堆内存,并后获得一个地址值传给了栈内存中的主函数,其name和age 的 初始化为null和0,然后构造函数进入栈,对其进行初始化, 使s=wangwu a=29 通过主函数内的地址值传递给实例对象,使其赋值,然后构造函数弹栈,进行下一个函数的调用。
-
图片1.png
(53.99 KB, 下载次数: 17)
作者: 孙浩 时间: 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 |