您的位置:首页 > 编程语言 > Java开发

java 值传递和引用传递

2016-10-04 20:43 357 查看

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

    答:是值传递。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 ok
good 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:如有不妥之处,还望指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: