JAVA中只有按值传递,这句话对么?

ssnec 2010-06-02 11:28:50
经常被绕昏。

比如如果没有NEW。

那么 Object o1= o2;
仅仅是o1和o2都指向一个内存空间。好像是引用传递么。
...全文
1154 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
mwzhj 2011-08-22
  • 打赏
  • 举报
回复
分为按值传递和按引用传递,如果是属于八种基本数据类型就是按值传递,如果不属于就是按引用传递
微风飘过 2011-08-22
  • 打赏
  • 举报
回复
还能传递引用啊
daxiang253 2011-08-21
  • 打赏
  • 举报
回复
按什么传递
要值的类型
还要看赋值语句
只有按值传递肯定是错误的啊
gsy999 2011-08-21
  • 打赏
  • 举报
回复
  方法参数(取自《Java2核心技术卷Ⅰ:基础知识》p114)
  先来回顾一下程序设计语言中有关参数传递的计算机科学术语。“传值调用”(call by value)表示方法得到的是调用者提供的值。与之相对,“传引用调用”(call by reference)表示方法得到的是调用者提供的变量地址。这样,方法可以修改引用调用所传递变量的值,但不能修改传值调用送来的变量。不论是在Java中还是在其他各种程序设计语言中,术语“...调用”(call by ...)都是用来描述方法参数行为的标准计算机科学术语。
  Java语言总是使用传值调用。这也意味着方法得到的只是所有参数值的拷贝。因此,方法不能修改传递给它的任何参数变量的内容。
  例如:下面的调用:
  double percent = 10;
  harry.raiseSalay(percent);
  不管这个方法如何实现,方法调用后,percent的值仍然会是10。
  主我们稍微仔细地研究一下这种情况。假设一个方法要使方法参数的值增至3倍:
  public static void tripleValue(double x);//不能工作
  {
    x = 3 * x;
  }
  然后,我们调用此方法:
  double percent = 10;
  tripleValue(percent);
  然而,这样做无法达到目的。方法调用后,percent的值仍旧是10。下面是有关的执行过程:
  1)x被初始化为percent值的一个拷贝(即10)。
  2)x被增至3倍,变成30。但percent仍旧是10(参见下图)。
  3)方法结束后,参数变量x不再使用。
           ┌────┐
       ┌───│值的拷贝│
       ↓   └────┘
  percent= 10
  ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂
     x= 30
       ↑   ┌─────┐
       └───│值增至3倍│
           └─────┘
  方法参数共有两种:
  ●基本类型(数字、布尔值);
  ●对象引用。
  方法不能改变基本类型的参数。但对于对象参数来说,情况则有所不同。我们可以很容易地实现一个方法,把员工的薪金增至3倍。
  public static void tripleSalary(Employee x)//能够工作
  {
    x.raiseSalary(200);
  }
  执行调用:
  harry = new Employee(...);
  tripleSalayr(harry);
  的具体工作过程如下:
  1)x被初始化为harry值的一个拷贝,即一个对象引用。
  2)向此对象引用应用raiseSalary方法。x和harry都指向的那个Employee对象的薪金被提高了200%.
  3)方法结束后,参数变量x不再使用。但对象变量harry继续指向薪金被增至3倍的那个对象。
  可以看到,实现改变对象参数状态的方法很容易。实际上,这种方式也很普遍。后面的原因很简单。方法得到对对象引用的一个拷贝,原来的对象变量和这个拷贝所指向的是同一个对象。
  很多程序设计语言(尤其是C++和Pascal)有两种参数调用的方法:传值调用和传引用调用。所以,有一些程序员(不幸的是,其中有些甚至是某些书的作者)声称Java程序设计语言对对象使用的是传引用调用。这种理解是错误的。由于,这种误解的普遍性,我们在下面举出一个反例来进行详细阐述。
  下面的方法用来交换两个员工对象:
  public static void swap(Employee x, Employee y)//无法工作
  {
    Employee temp = x;
    x = y;
    y = temp;
  }
  如果Java程序设计语言对对象使用的是传引用调用,那么这个方法将会达成目标:
  Employee a = new Employee("Alice"..);
  Employee b = new Employee("Bom"..);
  swap(a,b);
  //
  可是,这个方法事实上并没有改变存储在变量a和变量b中的对象引用。swap方法中的x和y参数被初始化为这两个引用的拷贝。然后,这个方法交换两个拷贝。
  //
  Employee temp = x;
  x = y;
  y = temp;
  但最终这么做是徒劳无功的。当方法结束后,参数变量x和y就被丢弃了。原来的变量a和b仍旧指向方法调用前各自所指向的对象。
  上面的讨论说明Java程序设计语言中并不向对象使用引用调用。实际上,对象引用是通过值来传递的。
  下面归纳了Java程序设计语言中利用方法参数可以做到和不能做到的几种情况:
  ●方法不能修改基本类型(即数字或布尔型)的参数。
  ●方法可以修改对象参数的状态。
  ●方法不能让对象参数指向新的对象。
-----------------------
  C++既有传值调用,也有传引用调用。传引用调用只需在引用参数前标上&。例如,可以容易实现修改其引用参数的方法void tripleValue(double& x)或者void swap(Employee& x, Employee& y)。
----------------------
cuiyanlei2010 2011-08-21
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 menggudaoke 的回复:]

值传递,传递地址也是值传递
[/Quote]

非常同意,java中只有值传递,没有引用传递,如果你学过C++你就会知道,C++中的引用传递才是真正意义上的引用传递。java中所谓的引用传递只是便于理解非基本数据类型传递的方式是传递地址值。
menggudaoke 2011-08-21
  • 打赏
  • 举报
回复
值传递,传递地址也是值传递
大佬 2011-08-21
  • 打赏
  • 举报
回复
基本类型按值传递
对象按引用传递
myl915 2011-08-21
  • 打赏
  • 举报
回复
动手试就知道了
daijope 2011-08-20
  • 打赏
  • 举报
回复
不要纠结与这种概念,理解原理就行了,不管是基本类型,还是引用类型,传递的都是一份拷贝。
Studious_Li 2011-08-20
  • 打赏
  • 举报
回复
完全正确啊.只有值传递,老师说这是SUN公司说的,除了基本类型的变量,其他变量的值都是其引用的地址值,所以在变量之间赋值的时候传递的是引用的地址值
xzxw1115 2011-08-19
  • 打赏
  • 举报
回复
一个是基本数值,一个是引用的地址
qybao 2011-08-19
  • 打赏
  • 举报
回复
看你怎么理解值传递的 的意思
比如 String s = "abc";
要知道 s 是个栈内的变量,有自己的内存空间,它的内存空间保存着 "abc"字符串对象的地址
如果 值 理解为变量的内存空间保存的内容,那么都是按 值 传递的
如果 值 理解为"abc"字符串对象的内容,那么就是按 引用 传递的
skyWalker_ONLY 2011-08-19
  • 打赏
  • 举报
回复
无论是基本类型还是类类型都是按值传递,这是毋庸置疑的
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 dejinzhao 的回复:]
都是值传递
public class TestPassByValue {
private String value;
public TestPassByValue(String value) {
this.value=value;
}
public void print(){
System.out.println(value);
}
public ……
[/Quote]
不太同意你观点。
b=a;这句不是b指向a的地址,而是说a,b指向同一个地址。当a=new TestPassByValue("second")时,a指向的地址发生变化,跟b没有一点关系,个人见解
pywepe 2011-08-18
  • 打赏
  • 举报
回复
对啊 回复内容太短了! 回复内容太短了!
fondOfJava 2011-08-18
  • 打赏
  • 举报
回复
对的..基本上都是按值传递,关键这个值你是怎么理解而已。
HelloJuese 2011-08-18
  • 打赏
  • 举报
回复
只有值传递吧。。。
meran 2011-08-18
  • 打赏
  • 举报
回复
这句话是对的。 但是你要仔细研究下分别传的是什么
小景 2011-08-18
  • 打赏
  • 举报
回复
java传值的形式有且只有一种,那就是值传递,基本数据类型就说了,如果是引用类型的传递的是引用地址的值,所以某种角度讲引用传递这种说法在java里都是错误的
hui1102 2011-08-18
  • 打赏
  • 举报
回复
java传值的形式有且只有一种,那就是值传递,基本数据类型就说了,如果是引用类型的传递的是引用地址的值,所以某种角度讲引用传递这种说法在java里都是错误的
加载更多回复(35)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧