Java 引用传递
来源:互联网 发布:java面试专业技能 编辑:程序博客网 时间:2024/05/22 13:12
http://bbs.csdn.net/topics/390245117
我个人理解翻来覆去就两句话:
1、Java函数调用时,参数传递方式为值传递;2、当该参数类型为对象(Object)时,则所传递的值为对象的引用(也可理解为地址)。
如果你认为Java函数调用有指针传递或引用传递的话,你可以尝试编写这样一个函数来验证:
public void swap(Object a, Object b);
效果就是调用后,主调函数的这两个对象互换即可。
比如主调函数是:
String a = "A";
String b = "B";
swap(a, b);
System.out.println(a); // 这里请输出 B
System.out.println(b); // 这里请输出 A
当然,你别用反射之类的方式直接去修改常量池啥的招数。。。
其实不能说Java "无引用传递", 而是Java针对非Primitive的数据类型"自动”进行了引用传递。
在C++里,假设有一个对象叫做foo, 那么在传递参数的时候:
1
2
3
4
5
6
7
//函数fun
void
fun(Foo foo){
...
}
//传递参数foo给函数fun
fun(foo);
这时候直接这么写,C++编译器就直接是把对象foo按值拷贝传递给了函数fun, 如果要使用按引用传递,则必须写成:
1
2
fun(&foo);
在Java里,由于在语法级别没有引用和指针的概念了,Java虚拟机强制规定,对于Primitive类型(int,float,double,boolean等基础数据类型),在传递参数时按值传递;对继承于Object的对象类型,在传递参数是“必须”使用引用传递,也就是说程序员没有选择的余地,即使想在Java中按值传递对象也是不可能的
java中的引用类型概念
(2012-10-09 16:06:33)转载▼
标签:
java
引用类型
按值传递
按引用传递
杂谈
分类: java1、什么是引用类型
引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。
在java里面除去基本数据类型的其它类型都是引用数据类型,自己定义的class类都是引用类型,可以像基本类型一样使用。
示例如下:
public class MyDate {
private int day = 8;
private int month = 8;
private int year = 2008;
private MyDate(int day, int month, int year){...}
public void print(){...}
}
public class TestMyDate {
public static void main(String args[]) {
//这个today变量就是一个引用类型的变量
MyDate today = new MyDate(23, 7, 2008);
}
}
2、引用类型的赋值
在java编程语言中,用类的一个类型声明的变量被指定为引用类型,这是因为它正在引用一个非原始类型,这对赋值具有重要的意义。如下代码:
int x = 7;
int y = x;
String s = "Hello";
String t = s;
四个变量被创建:两个原始类型 int 和两个引用类型String。x的值是7,而这个值被复制到y;x和y是两个独立的变量且其中任何一个的进一步的变化都不对另外一个构成影响。至于变量s和t,只有一个String对象存在,它包含了文本"Hello",s和t均引用这个单一个对象。
如果将变量t重新定义为t="World";则新的对象World被创建,而t引用这个对象。
3、按值传递和按引用传递的区别
1)按值传递
指的是在方法调用时,传递的参数是按值的拷贝传递。示例如下:
1. public class TempTest {
2. private void test1(int a) {
3. // 做点事情
4. a++;
5. }
6.
7. public static void main(String args[]) {
8. TempTest t = new TempTest();
9. int a = 3;
10. t.test1(a);//这里传递的参数a就是按值传递。
11. System.out.printIn("main方法中的a===" + a);
12. }
13. }
按值传递的重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。第9行的a和第2行的a是两个变量,当改变第2行的a的值,第9行a的值是不变的,所以打印结果是3。
main 方法中的a 为 3
test1 方法中的a 为 4
我们把第9行的a称之为实参,第2行的a称之为形参;对于基本数据类型,形参数据的改变,不影响实参的数据。
2)按引用传递
指的是在方法调用时,传递的参数是按引用进行传递,其实传递的是引用的地址,也就是变量所对应的内存空间的地址。
示例如下:
1. public class TempTest {
2.
2、引用类型的赋值
3、按值传递和按引用传递的区别
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
1.
2.