值传递和引用传递

  java应用程序有且只有一种参数传递机制,即按值传递。

  按值传递:当将一个参数传递给一个函数的时候,函数接收的是原始值的一个副本,因此,如果函数修改了该参数,仅仅修改的是参数的副本,而原始值保持不变。按引用传递一位置当一个参数传递给一个函数的时候,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。

  1.对象是按照引用传递;

  2.java中仅存在一种参数传递机制,即按值传递;

  3.按值传递意味着当一个参数传递给一个函数的时候,函数接收的是原始值的一个副本;

  4.按引用传递意味着当将一个参数传递给一个函数的时候,函数接收的是原始值的内存地址,而不是值的副本。

1.引用传递的例子

package PassTest;

public class Test1
{
	public static void main(String[] args)
	{
		StringBuffer s1 = new StringBuffer("good");
		StringBuffer s2 = s1;
		s2.append(" afternoon.");
		System.out.println(s1);
	}

}

输出结果:

good afternoon.

  对象s1和s2都指向内存中的同一个地址,则指向的是同一个对象。虽然这里看做的是“引用传递”,

但引用传递其实也是传值,因为对象就是一个指针,这个赋值是在指针之间的赋值,因此在java中将它称为传引用。

2.值传递的例子

package PassTest;

public class Test2 
{
	public static void main(String[] args)
	{
		int i1 = 5;
		int i2 = i1;
		i2 = 6;
		System.out.println(i1);
	}

}

输出结果:

5

  由于i1和i2是原始数据类型,而原始数据类型是按值传递,所以修改的其实只是原始值的一个副本,原始值并不会改变。

package PassTest;

public class Test3 
{
	public static void main(String[] args)
	{
		StringBuffer s1 = new StringBuffer("good");
		StringBuffer s2 = new StringBuffer("bad");
		test(s1, s2);
		System.out.println(s1);//9
		System.out.println(s2);//10
	}
	
	static void test(StringBuffer s1, StringBuffer s2)
	{
		System.out.println(s1);//1
		System.out.println(s2);//2
		s2 = s1;//3
		s1 = new StringBuffer("new");//4
		System.out.println(s1);//5
		System.out.println(s2);//6
		s1.append("haha");//7
		s2.append("haha");//8
	}

}

输出结果:

good
bad
new
good
goodhaha
bad

分析:

  1和2比较容易明白,3使得s2指向s1,这时候s2指向的值为“good”,而4使得s指向“new”,所以在5和6的时候输出的结果是new和good。而7使得new变为了newhaha,8使得good变成了goodhaha。再看9和10,此时由于9中的s对应的是good,在test函数中被修改为了goodhaha,所以输出了goodhaha,而10中的s2指向的bad在test函数中并没有被改变,所以输出的是bad。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大闲人柴毛毛

剑指offer代码解析——面试题21包含min函数的栈

题目:实现一个栈,要求使用O(1)时间获取栈中最小值,O(1)执行pop、push操作。    分析:要获取栈的最小值,我们首先想到的思路就是使用一个全局...

3708
来自专栏Java帮帮-微信公众号-技术文章全总结

13(01)总结StringBuffer,StringBuilder,数组高级,Arrays,Integer,Character

1:StringBuffer(掌握) (1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了 一...

4205
来自专栏nnngu

数据结构05 栈

这篇文章要总结的是栈,主要从以下几个方面来进行总结。 1、栈是什么 2、栈的存储结构 3、栈的常见操作及代码实现 1、栈是什么 栈是一种特殊的线性表,它限定了只...

3676
来自专栏从零开始学 Web 前端

06 - JavaSE之常用类

public StringBuffer append(...) 可以为该 StringBuffer 对象添加字符序列,返回添加后的该 StringBuffer ...

752
来自专栏个人随笔

房上的猫:StringBuffer类

一.使用StringBuffer类  StringBuffer类位于java.lang包中,是String类的增强类  步骤:   1.声明StringBuff...

35315
来自专栏Java Web

数据结构与算法(2)——栈和队列栈队列LeetCode 相关题目整理其他题目整理

栈是一种用于存储数据的简单数据结构(与链表类似)。数据入栈的次序是栈的关键。可以把一桶桶装的薯片看作是一个栈的例子,当薯片做好之后,它们会依次被添加到桶里,每一...

2093
来自专栏机器学习入门

挑战程序竞赛系列(75):4.3强连通分量分解(2)

挑战程序竞赛系列(75):4.3强连通分量分解(2) 传送门:POJ 3180: The Cow Prom 题意: 求结点大于等于2的强连通分量个数。 直接上...

2066
来自专栏java学习

面试题53(考察求职者对String声明变量在jvm中的存储方法)

(单选题) 1、有如下一段代码,请选择其运行结果() public class StringDemo{ private static final Stri...

2963
来自专栏大闲人柴毛毛

剑指offer代码解析——面试题22栈的压入、弹出序列

本题的详细分析过程均在代码的注释中: import java.util.Stack; /** * 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断...

3017
来自专栏岑志军的专栏

Swift学习-函数

15310

扫码关注云+社区

领取腾讯云代金券