| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2410 人关注过本帖
标题:传值和传址有什么区别 还有...
只看楼主 加入收藏
h17891789
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-12-18
收藏
 问题点数:0 回复次数:11 
传值和传址有什么区别 还有...

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.传值和传址有什么区别  能用程序说明下吗?
我是才学 有些问题总是很混淆呢  希望各位多多指教!


搜索更多相关主题的帖子: 传值 传址 
2007-03-29 17:30
laoriver
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2007-3-19
收藏
得分:0 
1、print()是GlobalVar2的成员函数,a=22会给成员变量赋值,所以after ....会是22;
2、如果在 a=22之前加上int,就是指你在该块中声明了一个局部变量并赋初值为22,但你最后的输出语句是打印globalVar的成员变量,此时为10;
后面的就不会啦

2007-03-29 17:40
yushui
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:1355
专家分:22
注 册:2006-7-19
收藏
得分:0 
在print()里面的a并不是重新申明的,只是在快中重新定义了 不过我也弄不怎么明白 呵呵

fighting!from now on!
2007-03-29 17:46
h17891789
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-12-18
收藏
得分:0 
谢谢咯  但是我还是不怎么明白呢 请说详细些啊  楼上两位;
2007-03-29 18:29
kisswpp
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-3-14
收藏
得分:0 

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

定义了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。
传值的特点我的理解是新值覆盖旧值,旧值就没有了。
而传址的话我的理解是改边了其指向的内存地址,而原来的内存地址中的值病没有改变。

2007-03-29 20:13
xw2014
Rank: 1
等 级:新手上路
帖 子:54
专家分:0
注 册:2006-1-17
收藏
得分:0 
一个是引用类型,里面放的是这个数的地址,也可以说是指针,一个是数值类型,里面放的是他本身

2007-03-30 08:25
hwj20070118
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2007-1-18
收藏
得分:0 
略懂!
2007-04-03 18:08
w5644266
Rank: 1
等 级:新手上路
帖 子:101
专家分:0
注 册:2007-4-4
收藏
得分:0 

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

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

2007-04-06 09:12
旋转女孩
Rank: 1
等 级:新手上路
帖 子:121
专家分:0
注 册:2007-3-22
收藏
得分:0 
1.a是成员变量,作用域是整个类print方法里面改变的就是成员变量a,所以输出的是22
2.如果你加上int的话那print方法中的a就是个局部变量,作用域只在本方法(即只在print方法中有效,出了这个方法
就没有效了)而你打印出的是成员变量a,所以输出的是10
3.http://zhidao.baidu.com/question/15950414.html 这里解释的很清楚而且也很形象很容易就明白
4.一般基本数据类型就是在传值,而一般得到对象的引用则是传址


即使所有人反对,我依然坚持我的选择……
2007-04-06 09:28
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 
JAVA中没有显式传地址,都是传值,就算是引用类型,传递的也是引用的值。只不过这个引用指向一个句柄,也就是一对指针。其中一个指针指向对象的方法表和对象的类型,另一个指针指向对象的数据。
2007-04-06 11:58
快速回复:传值和传址有什么区别 还有...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017503 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved