java引用传递_java中的参数传递——值传递、引用传递

本文深入探讨了Java中对象传递的引用与值的区别,通过Test01和Test02示例说明对象按引用传递的特点,并分析了Test03中的复杂情况。作者将Java对象比作C/C++指针,帮助理解参数传递机制和不同场景下的行为差异。
摘要由CSDN通过智能技术生成

首先考试大来看看第一点:对象是按引用传递的

确实,这一点我想大家没有任何疑问,例如:

class Test01

{

public static void main(String[] args)

{

StringBuffer s= new StringBuffer("good");

StringBuffer s2=s;

s2.append(" afternoon.");

System.out.println(s);

}

}

对象s和s2指向的是内存中的同一个地址因此指向的也是同一个对象。

如何解释“对象是按引用传递的”的呢?

这里的意思是进行对象赋值操作是传递的是对象的引用,因此对象是按引用传递的,有问题吗?

程序运行的输出是:

good afternoon.

这说明s2和s是同一个对象。

这里有一点要澄清的是,这里的传对象其实也是传值,因为对象就是一个指针,这个赋值是指针之间的赋值,因此在java中就将它说成了传引用。(引用是什么?不就是地址吗?地址是什么,不过就是一个整数值)

再看看下面的例子:

class Test02

{

public static void main(String[] args)

{

int i=5;

int i2=i;

i2=6;

System.out.println(i);

}

}

程序的结果是什么?5!!!

这说明什么,原始数据类型是按值传递的,这个按值传递也是指的是进行赋值时的行为下一个问题:Java 应用程序有且仅有的一种参数传递机制,即按值传递

class Test03

{

public static void main(String[] args)

{

StringBuffer s= new StringBuffer("good");

StringBuffer s2=new StringBuffer("bad");

test(s,s2);

System.out.println(s);//9

System.out.println(s2);//10

}

static void test(StringBuffer s,StringBuffer s2) {

System.out.println(s);//1

System.out.println(s2);//2

s2=s;//3

s=new StringBuffer("new");//4

System.out.println(s);//5

System.out.println(s2);//6

s.append("hah");//7

s2.append("hah");//8

}

}

程序的输出是:

good

bad

new

good

goodhah

bad

考试大提示: 为什么输出是这样的?

这里需要强调的是“参数传递机制”,它是与赋值语句时的传递机制的不同。

我们看到1,2处的输出与我们的预计是完全匹配的

3将s2指向s,4将s指向一个新的对象

因此5的输出打印的是新创建的对象的内容,而6打印的原来的s的内容

7和8两个地方修改对象内容,但是9和10的输出为什么是那样的呢?

Java 应用程序有且仅有的一种参数传递机制,即按值传递。

至此,我想总结一下我对这个问题的最后的看法和我认为可以帮助大家理解的一种方法:

我们可以将java中的对象理解为c/c++中的指针

例如在c/c++中:

int *p;

print(p);//1

*p=5;

print(*p);//2

1打印的结果是什么,一个16进制的地址,2打印的结果是什么?5,也就是指针指向的内容。

即使在c/c++中,这个指针其实也是一个32位的整数,我们可以理解我一个long型的值。

而在java中一个对象s是什么,同样也是一个指针,也是一个int型的整数(对于JVM而言),我们在直接使用(即s2=s这样的情况,但是对于System.out.print(s)这种情况例外,因为它实际上被晃猄ystem.out.print(s.toString()))对象时它是一个int的整数,这个可以同时解释赋值的传引用和传参数时的传值(在这两种情况下都是直接使用),而我们在s.XXX这样的情况下时s其实就是c/c++中的*s这样的使用了。这种在不同的使用情况下出现不同的结果是java为我们做的一种简化,但是对于c/c++程序员可能是一种误导。java中有很多中这种根据上下文进行自动识别和处理的情况,下面是一个有点极端的情况:

class t

{

public static String t="t";

public static void main(String[] args)

{

t t =new t();

t.t();

}

static void t() {

System.out.println(t);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值