java 值传递和引用传递

来源:互联网 发布:通达信期货软件 编辑:程序博客网 时间:2024/05/11 19:10

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 

    答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。

Java中有人分为值传递和址传递。引用传递也就是址传递。
比如下列的方法
public void add(int a) {
int b = a;
}
这个可以看作是值传递,a是基本数据类型,他把他的值传给了b
public void add(Object obj) {
Object objTest = obj;
}
这个可以看作是址传递,obj是引用数据类型,是把他栈中指向堆中的对象的地址值赋值给了objTest.
这时候就同时有两个引用指向了堆中的某个Object对象

其实这样看来,java应该只有值传递的。如果是基本数据类型,传递的就是实际的值.

如果是引用数据类型,传递的就是该引用的地址值.

PS 原始类型和引用类型

原始类型也叫做基本类型,java只有8种基本类型,分别是byte,short,int,long,float,double,char,boolean。引用类型是自己定义的类对象。主要区别有,基本类型是在堆栈上进行内存分配,引用类型堆栈上只有引用,内存分配在堆上,属于动态分配。基本类型不可以调用方法,但是可以使用基本类型的包装器来调用。



下面看下这个经典的案列

package itany.test;/** * Created by ls on 2016/10/4. */public class Example {    String str=new String("good");    char[]ch={'a','b','c'};          public static void main(String args[]){        Example ex=new Example();        ex.change(ex.str,ex.ch);//        ex.change();        System.out.print(ex.str+" and ");        System.out.print(ex.ch);                }         /* public void change(String str,char ch[]) {        str = "test ok";  //这里的str,指向的是形参的引用副本        System.out.println(str);  //这里的str是局部变量,指向的形参的引用副本        ch[0] = 'g';               运行结果       test okgood and gbc//在输出的时候却不会调用对象的引用副本          }    */       //和上面方法比较 形参str -> str2  public void change(String str2,char ch[]) {        str = "test ok";   //这个是直接给全局变量str赋值,并未指向向形参str2的引用副本        System.out.println(str2);           System.out.println(str);  //这里的str是全局变量        ch[0] = 'g';        //        运行结果//       good//test ok//test ok and gbc          }       /*    public void change(String str3,char ch[]) {        str3 = "test ok"; // 对象调用的还是引用,并非引用的副本        ch[0] = 'g';        //输出 good and gbc    }    */              /*        public void change() {        str = "test ok";//这里就只直接给全局变量赋值        ch[0] = 'g';        //输出 test ok and gbc    }    */    }


PSS:如有不妥之处,还望指正。




0 0