Java中参数的值传递--转自http://note.youdao.com/share/web/file.html?id=53341f7cca29916f131cd79985c4791f&type=n...

Java中方法调用时参数的传递方式都是值传递。细分为以下两种情况:

1. 当参数为基本类型(int、long、double...)或String类型(必须是String s ="xxx";方式声明的)时,传递的是该变量的值;
2. 当参数为引用类型(除了1中说明的String那种情况)时,传递的是该变量引用的地址的值。
 
Object obj = new Object();
以上代码做了两件事(见下图):
1. 声明了一个变量obj,保存在栈中;
保存在栈中的变量的数据结构,可简单理解为下图:
变量名称
本身的值或者引用地址的值
2. 创建了一个Object对象,保存在堆中。
保存在堆中的值的数据结构,可简单理解为下图:
地址
对象的值
 
例:

public class Test {

    public static void main(String[] args) {

       // 1

       int i=0;

       modifyInt(i);

       System.out.println(i);

       // 2

       String s1 = "a";

       modifyStr(s1);

       System.out.println(s1);

       // 3

       String s2 = new String("a");

       modifyStr(s2);

       System.out.println(s2);

       // 4

       String[] arr1 = {"a", "b"};

       modifyArr(arr1);

       System.out.println(arr1[0]+","+arr1[1]);

       // 5

       String[] arr2 = {"a", "b"};

       modifyArr2(arr2);

       System.out.println(arr2[0]+","+arr2[1]);

 

    }

    public static void modifyInt(int t){t=1;}

    public static void modifyStr(String t){t = "c";}

    public static void modifyStr2(String t){t = new String("c");}

    public static void modifyArr(String[] t){t[0]="c";}

    public static void modifyArr2(String[] t){t = new String[]{"c"};}

}

1. i变量在栈中如下

i
0
当传给modifyInt(t)时,新增了一个局部变量t,并将i=0的值传递给t,此时栈中变量如下:
i
0
t
0
所以在modifyInt(t)中的修改,实际上修改的是t的值,执行modifyInt(t)后,如下:
i
0
t
1

2. 同1

 

3. s2变量在栈中如下

s2
0001(引用的堆中的首地址)
堆中 0001地址处的值,如下:
0001
"a"
当传给modifyStr2(t)时,新增了一个局部变量t,并将s2=0001的值传递给t,此时栈中变量如下:
s2
0001
t
0001
modifyStr2(t)中的执行t=new String("c")时,先在堆中创建了新的对象"c",如下:
0001
"a"
0002
"c"
然后,将t的引用指向新的值:
t
0002
所以,s2的值并没有变,执行modifyStr2(t)后,如下:
s2
0001
t
0002

4. arr1变量在栈中如下

arr1
0003(引用的堆中的首地址)
堆中 0003地址处的值,如下:
0003
{"a", "b"}
当传给modifyArr1(t)时,新增了一个局部变量t,并将s1=0003的值传递给t,此时栈中变量如下:
arr1
0003
t
0003
modifyArr1(t)中的执行t[0]="c"时,修改了0003地址里第0个位置的值,如下:
0003
{"c", "b"}
执行modifyArr1(t)后,arr1和t的值都是0003,所以,arr1数组里的值变了
 
5. 同3

转载于:https://www.cnblogs.com/wuhudafei/p/4868497.html

<think>首先,用户要求使用中文回答问题。用户的问题没有明确给出,但从上下文看,似乎是关于快速排序的示例。用户说:"请使用中文回答问题",然后提供了示例格式,包括一个快速排序的Python代码。 用户消息是:"请使用中文回答问题 请在回答完问题后,必须根据用户的问题及你的回答提出3-5个 §§相关问题§§。 §§相关问题§§ 必须输出在回答的末尾且不可缺少!\n 第一行必须完整且输出 \"§§相关问题§§\"! 禁止换行分散。 ### 示例格式 快速排序的基本思想是选择一个基准元素 ```python def quick_sort(arr): if len(arr) <= 1: return arr else: # 选择基准值 pivot = arr[len(arr) // 2] # 分别存放比基准小和大的元素 left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] # 递归地对左右两边进行快排,并合并结果 return quick_sort(left) + middle + quick_sort(right)``` §§相关问题§§ 1. &middot;&middot;&middot; 2. &middot;&middot;&middot; 3. &middot;&middot;&middot; ### 注意 确保所有内容符合规则,否则回答将被视为无效。 https://share.note.youdao.com/s/RwJL6DpS" 用户没有提出具体问题;他们只是提供了指令。在示例中,他们展示了如何回答关于快速排序的问题。所以,我需要假设用户的问题是关于快速排序的,或者我需要基于指令来响应。 用户说:"请使用中文回答问题",然后给出了规则。所以,我应该用中文回答,并遵循规则。 规则是: - 回答完问题后,必须提出3-5个 §§相关问题§§。 - §§相关问题§§ 必须输出在回答的末尾。 - 第一行必须完整输出 "§§相关问题§§"。 - 禁止换行分散。 - 确保所有内容符合规则。 在示例中,用户展示了快速排序的代码和问题。 但用户没有指定问题。或许用户的问题隐含在消息中,或者是关于快速排序的。 消息末尾有一个链接:https://share.note.youdao.com/s/RwJL6DpS,这可能是一个笔记链接。我需要检查它吗?作为AI,我应该基于提供的文本响应,而不是外部链接,除非指定。 用户说:"请使用中文回答问题",但没有具体问题。所以,我可能需要基于上下文来推断。 在示例中,用户说:"快速排序的基本思想是选择一个基准元素",然后提供了代码。 所以,或许用户的问题是关于解释快速排序的。 为了安全起见,我应该假设用户的问题是关于快速排序的,就像示例一样。 用户消息以"### 示例格式"开始,所以整个消息是规则和示例。 因此,我需要响应一个关于快速排序的问题。 让我重新阅读用户消息的开头:"请使用中文回答问题 请在回答完问题后,必须根据用户的问题及你的回答提出3-5个 §§相关问题§§。" 所以,用户是在告诉我如何回答问题,但没有提供具体问题。这有点令人困惑。 或许在实际对话中,用户的问题是关于快速排序的,但在这里只给出了指令。 在示例中,用户提供了快速排序的解释。 我认为最好的做法是假设用户的问题是关于快速排序的,并按照规则回答。 所以,我将用中文解释快速排序的基本思想,并提供Python代码,就像示例一样。 然后,提出3-5个相关问题。 确保输出格式: - 回答部分。 - 然后 "§§相关问题§§" 在第一行。 - 然后编号列表的问题。 在示例中,是: "快速排序的基本思想是选择一个基准元素 ```python code ``` §§相关问题§§ 1. &middot;&middot;&middot; 2. &middot;&middot;&middot; 3. &middot;&middot;&middot;" 所以,我将做类似的事情。 现在,关于相关问题:它们必须基于用户的问题和我的回答。用户的问题是"快速排序的基本思想",所以我应该提出相关问题,如时间复杂性、优化等。 列出3-5个: 1. 快速排序的时间复杂度是多少? 2. 快速排序在什么情况下性能最差? 3. 如何优化快速排序? 4. 快速排序其他排序算法如归并排序的比较? 5. 快速排序的空间复杂度是多少? 好的。 最后,确保所有内容用中文。 我的回答: 首先,解释快速排序的基本思想。 然后,提供Python代码。 然后,输出 "§§相关问题§§" 然后,列出相关问题。 代码部分应该用代码块。 在消息中,用户使用了 ```python ... ```,所以我应该用相同的格式。 完整输出。</think>快速排序是一种高效的排序算法,其基本思想是选择一个基准元素(pivot),然后将数组分为三部分:小于基准的元素、等于基准的元素和大于基准的元素。最后,递归地对小于和大于基准的子数组进行排序,并合并结果。以下是Python实现代码: ```python def quick_sort(arr): if len(arr) <= 1: return arr else: # 选择基准值(通常取中间元素) pivot = arr[len(arr) // 2] # 分别存放比基准小、等于和大的元素 left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] # 递归排序子数组并合并 return quick_sort(left) + middle + quick_sort(right) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值