Java中的值传递和引用传递

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 
    答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。

Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。

    如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的 值不会改变原始的值.

    如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。

如果你想学习Java可以来这个群,首先是五三二,中间是二五九,最后是九五二,里面有大量的学习资料可以下载。

例:

 1 public class ParamTest {
 2     public static void main(String[] args){
 3           /**
 4            * Test 1: Methods can't modify numeric parameters
 5            */
 6          System.out.println("Testing tripleValue:");
 7           double percent = 10;
 8           System.out.println("Before: percent=" + percent);
 9           tripleValue(percent);
10           System.out.println("After: percent=" + percent);
11
12           /**
13            * Test 2: Methods can change the state of object parameters
14            */
15           System.out.println("\nTesting tripleSalary:");
16           Employee harry = new Employee("Harry", 50000);
17           System.out.println("Before: salary=" + harry.getSalary());
18           tripleSalary(harry);
19           System.out.println("After: salary=" + harry.getSalary());
20
21           /**
22            * Test 3: Methods can't attach new objects to object parameters
23            */
24           System.out.println("\nTesting swap:");
25           Employee a = new Employee("Alice", 70000);
26           Employee b = new Employee("Bob", 60000);
27           System.out.println("Before: a=" + a.getName());
28           System.out.println("Before: b=" + b.getName());
29           swap(a, b);
30           System.out.println("After: a=" + a.getName());
31           System.out.println("After: b=" + b.getName());
32     }
33
34     private static void swap(Employee x, Employee y) {
35         Employee temp = x;
36         x=y;
37         y=temp;
38         System.out.println("End of method: x=" + x.getName());
39         System.out.println("End of method: y=" + y.getName());
40     }
41
42     private static void tripleSalary(Employee x) {
43         x.raiseSalary(200);
44         System.out.println("End of method: salary=" + x.getSalary());
45     }
46
47     private static void tripleValue(double x) {
48         x=3*x;
49         System.out.println("End of Method X= "+x);
50     }
51 }

  显示结果:

Testing tripleValue:
Before: percent=10.0
End of Method X= 30.0
After: percent=10.0

Testing tripleSalary:
Before: salary=50000.0
End of method: salary=150000.0
After: salary=150000.0

Testing swap:
Before: a=Alice
Before: b=Bob
End of method: x=Bob  //可见引用的副本进行了交换
End of method: y=Alice
After: a=Alice  //引用本身没有交换
After: b=Bob

时间: 2024-08-01 23:57:08

Java中的值传递和引用传递的相关文章

Java中的值传递和引用传递实例介绍_java

复制代码 代码如下: package Object.reference; public class People {     private String name;     private int age;     public People(){     }     public People(String name, int age) {         super();         this.name = name;         this.age = age;     }    

java中如何区分值传递和引用传递

java中值传递和引用传递一直饱受争议难以区分,下面我通过几个例子来区分一下什么时间是值传递,什么时间是引用传递 1:首先先说值传递:基本类型(int ,float ,long,byte,short ,double, char,boolean)作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的 package com.test.list; public class Test1 { public static void main(String[] args) { int i

Java值传递和引用传递

先明晰一下文中值传递和引用传递的含义(关于对引用的定义的争议请参考评论区). 值传递:方法调用时,实参把它的值传递给对应的形参(或者说副本),方法执行中形式参数值的改变不影响实际参 数的值. 引用传递:也称为传地址.方法调用时,实参的引用(地址,而不是参数的值)被传递给方法中相对应的形参,在方法执行中,对形参的操作实际上就是对实参的操作,方法执行中形式参数值的改变将会影响实际参数的值. 两个看似没什么区别的代码 代码一 public static void main(String[] args)

java及C++中传值传递、引用传递和指针方式的理解_java

java的值传递理解: 代码1: public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); SChange(buffer); System.out.println( buffer); } public static void SChange (StringBuffer str) { st

对象-java传递 ”值传递和引用传递“还是全部 “值传递”

问题描述 java传递 "值传递和引用传递"还是全部 "值传递" 若说值传递.基本类型是copy的值赋给形参,对象是把 堆中对象的 地址 传给 形参. 若说分为值传递和引用传递..引用传递 是因为这个传的地址,导致实参和形参 操作的都是同一块内存. 有点乱,像文字层次上的撕逼.. 若往引用传递方面思考,C++的指针又把我搅乱了.,java里不能直接管理内存,传递的不是 变量本身 的栈地址.而是变量的内容(值) 解决方案 java没有什么值传递引用传递,都是传递对象引

java的值传递和引用传递

java的值传递和引用传递 1. "="是赋值操作. 任何包含=的如+=.-=. /=等等,都内含了赋值操作. 不再是你以前理解的数学含义了,而+ - * /和 = 在java中更不是一个级别,换句话说, = 是一个动作,一个可以改变内存状态的操作,一个可以改变变量的符号,而+ - * /却不会. 这里的赋值操作其实是包含了两个意思: 1.放弃了原有的值或引用: 2.得到了 = 右侧变量的值或引用.Java中对 = 的理解很重要啊!!可惜好多人忽略了,或者理解了却没深思过. 2. 对于

源自一个面试的问题:字符串在函数的参数中是当成值传递还是引用传递。

问题描述 源自一个面试的问题:字符串在函数的参数中是当成值传递还是引用传递.这是测试方法: public void setA(String a) { System.out.println("In the setmethod before set:解决方案二:# " + a); a = "I am a student"; System.out.println("In the setmethod after set:解决方案三:# " + a); }

请教关于JavaScript中的对象是按照值传递还是引用传递

问题描述 请教关于JavaScript中的对象是按照值传递还是引用传递 function SetName(obj){ obj.name="Tom";//执行之前,此时的obj和Person的name属性均为undefined obj1=new Object(); obj1=obj;//声明一个全局对象,那么obj.obj1和Person此时应该是同一个对象 }//SetName函数执行完之后,obj对象销毁,其余对象仍然存在 Person=new Object();//声明Person

Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇也就够了,不过我也尽量陈述的很详细 一.指针 要说指针,其实通俗易懂的话来说,他应该是保存内存地址的一个变量,我们来看一下小例子 #include <stdio.h> #include <stdlib.h> main(){ //int 变量 int i ; i = 5; //打印i的值