当前位置:编程学习 > JAVA >>

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

经常被绕昏。

比如如果没有NEW。

那么 Object o1= o2;
仅仅是o1和o2都指向一个内存空间。好像是引用传递么。 --------------------编程问答-------------------- 引用和指针还是有区别的。

还取决于是引用类型还是值类型。 --------------------编程问答-------------------- 看此帖
java到底是按值传递还是按引用传递? --------------------编程问答-------------------- new 就是说在内存空间中新开辟一块地方。

Object 01 =02 ;是把01指向了 02所表示的那块内存的空间 你用 o1.equals(o2) 返回是一个TRUE 

==只是比较值是否相等,而equals比较内存地址跟值。

--------------------编程问答-------------------- JAVA的数据类型 有基本的数据类型跟引用数据类型  基本的值传递, 引用的内存地址传递 --------------------编程问答-------------------- 都是值传递,搞清楚“按引用传递”和“传递的是引用”的区别就能理解了 --------------------编程问答-------------------- 不需要区分,全部都是传值,不要把引用或者指针与其指向的对象混淆就可以了
--------------------编程问答-------------------- 首先要搞清楚基础类型   java的八种基础类型,基础类型都是直接传值的。

非基础类型即拥有 Class 对象的 实例,他们是需要堆空间的,指向他们的就是引用,引用所使用的存储空间是和基础类型一样,分配在栈中,所以引用改变就是直接改变了引用的内容。改变引用的内容是改变引用所指向的东西,而不会改变之前被引用的 实例 内容。

引用可以通过 实例函数去改变实例内容,这个是由于实例函数是知道实例的地址,直接操作实例地址中的内容的。

所以你说 java到底是传值还是转引用了?


任何语言数据操作都是在赋值,在传值。

传址只是人为的使用技巧在赋值的基础上建立的一种概念,概念怎么去说我觉得不太重要,重要的是你清楚它是什么做的。 --------------------编程问答-------------------- 又是这样绕的问题, 唉 --------------------编程问答-------------------- 个人观点

关于“基本类型是按值传递,非基本类型是按引用传递”这点
Object a = ...
Object b = ...
swap(a, b)
如果你能通过swap改变a、b引用的对象就证明是按引用传递,事实证明是按值传递
不过退一步讲,我们的程序里真正需要操作的并不是a、b引用本身,而是它们引用的对象,所以java通过“引用”这种数据类型,使得在按值传递的基础上间接实现了实际引用对象的引用的传递

所以,对于这个问题的答案
如果一定要精确地深究的话,答案是都是按值传递
但是如果我们着眼于堆上的对象本身的话,需要清楚在函数内部对参数里的引用进行操作的时候,实际操作的是函数外部的对象,这才是之所以要区分按值传递和按引用传递的最终目的,所以,结论是,java里通过按值传递实现了C++里按引用传递所能达到的效果 --------------------编程问答-------------------- java里面只有值传递,传递的参数是原来参数的一个克隆 --------------------编程问答-------------------- 首先回顾一下在程序设计语言中有关参数的传递方法(或者函数)的一些专业术语,值调用表示方法接受的是调用者提供的值,而引用调用表示方法接收的是调用者提供的变量地址,一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
java程序设计语言总是采用值传递也就是说方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给他的任何参数变量的内容。
例如 double p = 10;
    harry。raiseSalary(p);
不必理睬这个方法的具体实现,在方法调用之后,p的值还是10
如果还是不能理解可以找《java核心技术》第八版第115页开始都是讲解java的调用 --------------------编程问答-------------------- 对滴。。 --------------------编程问答-------------------- 真的很绕啊,,,,,用到的时候自己多注意就明白了 --------------------编程问答-------------------- 四处逛逛,顺便学习学习 --------------------编程问答-------------------- 只有值传递  --------------------编程问答-------------------- java只有值传递 --------------------编程问答-------------------- JAVA里的引用本质是是值的传递,只是引用修改了某一个内存地址上的数据。不知道准不准确~~~~ --------------------编程问答-------------------- 都是按值传,没值怎么传,传值时传的就是值本身,因为基本类型的值就存在栈上; 传对像类型时传的也是值,值就是对象的栈地址,也就是对象的堆区首地址 --------------------编程问答-------------------- 都是按值传,没值怎么传,传值时传的就是值本身,因为基本类型的值就存在栈上; 传对像类型时传的也是值,值就是对象的堆区首地址   .....不能编辑,kao --------------------编程问答-------------------- 本质都是传值,但是基本类型传值与对象类型传引用,表现出来的效果不一样。
基本类型传值不影响原来的值,对象传引用会影响对象的值 --------------------编程问答-------------------- 貌似不是吧,如果一个方法的参数如果是一个对象,那么传的应该是地址,因为你在方法内修改对象属性后,在方法外调用,应该是返回修改后的属性。 --------------------编程问答-------------------- 可以按值传递,也可以按引用传,看你怎么用了 --------------------编程问答--------------------
引用楼主 ssnec 的回复:
经常被绕昏。

比如如果没有NEW。

那么 Object o1= o2;
仅仅是o1和o2都指向一个内存空间。好像是引用传递么。

这里 o1 的值就是 o2 的值 即 对象的地址
也就是说这句话中是传的对象的地址的那个值(值传递)
两个引用的值是一样的,指向同一个对象
看起来像是引用传递其实不是 --------------------编程问答-------------------- 都是值传递
public class TestPassByValue {
    private String value;
    public TestPassByValue(String value) {
        this.value=value;
    }
    public void print(){
        System.out.println(value);
    }
    public static void main (String args[]) {
        TestPassByValue a=new TestPassByValue("first");
        TestPassByValue b=a;
        a.print();
        b.print();
        a=new TestPassByValue("second");
        a.print();
        b.print();
    }
}

运行结果:
first
first
second
first
明显是值传递

如果是按址传递、运行结果应该是:
first
first
second
second

按值时:
b=a他们的正直地址不同、但他们引用“相同的地址”-- new TestPassByValue("first")
a=new TestPassByValue("second")、改变了a的引用-新建立的对象,b的引用值不受影响

按址时:
b=a、b指向a的地址、a指向new TestPassByValue("first")的地址
a=new TestPassByValue("second")、a指向new TestPassByValue("second")的地址、b还是指向a的地址 --------------------编程问答-------------------- 如果传递的是基本数据类型,那么就是拷贝一份值
如果传递的是引用类型,那么拷贝的是一个引用 --------------------编程问答-------------------- --------------------编程问答-------------------- 话是对的。
理解起来很绕。 --------------------编程问答-------------------- 引用就是指针.
看看编译原理,全都懂了 --------------------编程问答-------------------- 不要被误导了
方法的参数传递是按值传递的方式传递的
--------------------编程问答-------------------- 按值传递,传的就是引用的值 --------------------编程问答-------------------- 不是。在Java中有原始数据类型和引用数据类型。原始数据类型是传值。而引用数据类型就相当于C语言里的地址 --------------------编程问答-------------------- 类式这个问题百度一大把,看都看不完
http://blog.csdn.net/niuniu20008/archive/2008/09/19/2953785.aspx
这个网站上说的还可以· --------------------编程问答-------------------- 传值,你写个例子试试,比别人告诉你要好的多。 --------------------编程问答-------------------- 纠结中 --------------------编程问答-------------------- 传值,还是引用,搞不清楚... --------------------编程问答-------------------- java传值的形式有且只有一种,那就是值传递,基本数据类型就说了,如果是引用类型的传递的是引用地址的值,所以某种角度讲引用传递这种说法在java里都是错误的 --------------------编程问答-------------------- java传值的形式有且只有一种,那就是值传递,基本数据类型就说了,如果是引用类型的传递的是引用地址的值,所以某种角度讲引用传递这种说法在java里都是错误的 
--------------------编程问答-------------------- 这句话是对的。 但是你要仔细研究下分别传的是什么 --------------------编程问答-------------------- 只有值传递吧。。。 --------------------编程问答-------------------- 对的..基本上都是按值传递,关键这个值你是怎么理解而已。 --------------------编程问答-------------------- 对啊 回复内容太短了! 回复内容太短了! --------------------编程问答-------------------- 无论是基本类型还是类类型都是按值传递,这是毋庸置疑的
--------------------编程问答-------------------- 看你怎么理解值传递的 值 的意思
比如 String s = "abc"; 
要知道 s 是个栈内的变量,有自己的内存空间,它的内存空间保存着 "abc"字符串对象的地址
如果 值 理解为变量的内存空间保存的内容,那么都是按 值 传递的
如果 值 理解为"abc"字符串对象的内容,那么就是按 引用 传递的
--------------------编程问答-------------------- 一个是基本数值,一个是引用的地址 --------------------编程问答--------------------
引用 24 楼 dejinzhao 的回复:
都是值传递
public class TestPassByValue {
  private String value;
  public TestPassByValue(String value) {
  this.value=value;
  }
  public void print(){
  System.out.println(value);
  }
  public ……

不太同意你观点。
b=a;这句不是b指向a的地址,而是说a,b指向同一个地址。当a=new TestPassByValue("second")时,a指向的地址发生变化,跟b没有一点关系,个人见解 --------------------编程问答-------------------- 完全正确啊.只有值传递,老师说这是SUN公司说的,除了基本类型的变量,其他变量的值都是其引用的地址值,所以在变量之间赋值的时候传递的是引用的地址值 --------------------编程问答-------------------- 不要纠结与这种概念,理解原理就行了,不管是基本类型,还是引用类型,传递的都是一份拷贝。 --------------------编程问答-------------------- 按什么传递  
 要值的类型 
   还要看赋值语句 
     只有按值传递肯定是错误的啊  --------------------编程问答-------------------- 动手试就知道了 --------------------编程问答--------------------     基本类型按值传递
    对象按引用传递 --------------------编程问答-------------------- 值传递,传递地址也是值传递 --------------------编程问答--------------------
引用 51 楼 menggudaoke 的回复:
值传递,传递地址也是值传递

 
非常同意,java中只有值传递,没有引用传递,如果你学过C++你就会知道,C++中的引用传递才是真正意义上的引用传递。java中所谓的引用传递只是便于理解非基本数据类型传递的方式是传递地址值。 --------------------编程问答--------------------   方法参数(取自《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)。
---------------------- --------------------编程问答-------------------- 还能传递引用啊 --------------------编程问答-------------------- 分为按值传递和按引用传递,如果是属于八种基本数据类型就是按值传递,如果不属于就是按引用传递
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,