当前位置: 代码迷 >> Java相关 >> 传值和传址有什么区别 还有...
  详细解决方案

传值和传址有什么区别 还有...

热度:93   发布时间:2007-03-29 17:30:09.0
传值和传址有什么区别 还有...

public class GlobalVar2
{
int a = 10;//定义成员变量
double b = 20;//定义成员变量
public static void main(String[] args)//入口方法
{
GlobalVar2 globalVar = new GlobalVar2();//实例化一个对象
System.out.println("the value a = " + globalVar.a);//静态方法里必须用对象来调用
globalVar.print();//对象调用方法
System.out.println("after changed the value a = " + globalVar.a);//输出打印
}
public void print()
{
System.out.println("the global variable a = " + a + ", b = " + b);
a=22;//给a赋值
System.out.println("the global variable a = " + a + ", b = " + b);

}
}

就是上面的一段程序 我不懂的问题有:
1.打印输出后 最后一个输出的是: after changed the value a =22 为什么啊 a=22不是在块中吗  调用的不是成员变量a=10吗?
2.在块中也就是 a=22;的前面如果加上类型修饰符 int 后 最后一条输出语句所显示的是成员变量a=10;为什么啊
另外 还有不是有不能在类中的块中重新定义吗
3.句柄和实例化对象有什么区别?
4.传值和传址有什么区别  能用程序说明下吗?
我是才学 有些问题总是很混淆呢  希望各位多多指教!


搜索更多相关的解决方案: 传值  传址  

----------------解决方案--------------------------------------------------------
1、print()是GlobalVar2的成员函数,a=22会给成员变量赋值,所以after ....会是22;
2、如果在 a=22之前加上int,就是指你在该块中声明了一个局部变量并赋初值为22,但你最后的输出语句是打印globalVar的成员变量,此时为10;
后面的就不会啦
----------------解决方案--------------------------------------------------------
在print()里面的a并不是重新申明的,只是在快中重新定义了 不过我也弄不怎么明白 呵呵
----------------解决方案--------------------------------------------------------
谢谢咯  但是我还是不怎么明白呢 请说详细些啊  楼上两位;
----------------解决方案--------------------------------------------------------

我也来讨论下吧~!(正在学,说错不要骂我和笑我,请指点。。)

定义了a和b之后,在栈里面开辟了两个内存空间,因为是简单数据类型,所以a的值是10,b的值是20,并没有指向,
在实例化GlobalVar2之后,在堆里开辟了一块内存globalVar。当打印"the value a = "时,并没有任何赋值给a,所以,打印出来的结果是10。
函数print()中的两个打印语句就不用说了
看看"after changed the value a = " 这句打印语句:
一开始a的值是10,没有指向别的地址,所以值是不变的,但是后来在print()中又一次给a赋值22,22覆盖了原来的10,所以打印出来是22。
传值的特点我的理解是新值覆盖旧值,旧值就没有了。
而传址的话我的理解是改边了其指向的内存地址,而原来的内存地址中的值病没有改变。


----------------解决方案--------------------------------------------------------
一个是引用类型,里面放的是这个数的地址,也可以说是指针,一个是数值类型,里面放的是他本身
----------------解决方案--------------------------------------------------------
略懂!
----------------解决方案--------------------------------------------------------

这个东西我是这样认识的:开始的时候那个a至是重新对a进行了赋值。。。它的作用范围在整个类。。如果你加了int 则是在方法里的a与前面的a没有任何关系。。。这就涉及到那个作用域的问题。。。方法里面定义的变量只能在这个方法里有作用、、

不知道我这样理解正确不。。。。。


----------------解决方案--------------------------------------------------------
1.a是成员变量,作用域是整个类print方法里面改变的就是成员变量a,所以输出的是22
2.如果你加上int的话那print方法中的a就是个局部变量,作用域只在本方法(即只在print方法中有效,出了这个方法
就没有效了)而你打印出的是成员变量a,所以输出的是10
3.http://zhidao.baidu.com/question/15950414 这里解释的很清楚而且也很形象很容易就明白
4.一般基本数据类型就是在传值,而一般得到对象的引用则是传址


----------------解决方案--------------------------------------------------------
JAVA中没有显式传地址,都是传值,就算是引用类型,传递的也是引用的值。只不过这个引用指向一个句柄,也就是一对指针。其中一个指针指向对象的方法表和对象的类型,另一个指针指向对象的数据。
----------------解决方案--------------------------------------------------------