java方法传参方式---到底是传值还是传址,还是两者都不对!!!

2024-02-26 03:08

本文主要是介绍java方法传参方式---到底是传值还是传址,还是两者都不对!!!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


       今天刚好领导写了几个面试新人的基础题,其中就有一道涉及java方法传值的题目,其实这个问题不仅对一些新人有难度,甚至可能对一些工作了好多年的人都搞不清楚,今天我就在这里简单的和大家分享下.

  题目如下:

package com.eden.coreLearn.javacore;import java.util.Arrays;/*** 类Parameter.java的实现描述:TODO 类实现描述 <br>* 测试java的传参方式(到底是传值还是传址)* * @author wangding_91@163.com 2016年3月10日 下午10:05:53*/
public class Parameter {static void exchange(String str2) {str2 = "cde";}static void exchange(int i) {i = 1;}static void exchange(char[] c) {c[0] = 'd';}public static void main(String[] args) {char[] a = new char[] { 'g', 'o', 'o', 'd' };int j = 0;String str1 = "abc";exchange(str1);exchange(a);exchange(j);System.out.println("str1=" + str1);System.out.println("a=" + Arrays.toString(a));System.out.println("j=" + j);}}



代码非常简单,然后要求说出输出结果。。。估计好多人咋一看,直接懵逼了!!!

先告诉大家结果:

str1=abc
a=[d, o, o, d]
j=0

从结果来看,只有数组a的值被改掉了,其他两个值都没被改掉,来分析下:

首先看str1

1:首先str2被初始化为str1的一个拷贝,str2和str1都是指向常量池中"abc"常量的引用

2:然后将str2指向新的常量"cde",但是和str1毛关系都没有

3:方法结束,str2被回收,str1的值不会有任何改变


再看char[] a

1:同样的char[] c初始化为new char['g','o','o','d']的引用char[] a的一个拷贝,即c和a指向同一个对象

2:利用c改了c指向的数组中的第一个元素,而a也是指向的这个数组

3:方法结束,c回收,而a指向的数组已经被改了,所以a能看见


int j就不说了,只是int是基本类型,这是不是引用的拷贝而是j本身的拷贝


总结:

   1:一个方法不能修改一个基本数据类型的参数

   2:一个方法可以改变一个对象的状态(属性)

   3:一个方法不能实现让对象参数引用一个新的对象


TODO

 String str = new String("123");这句话创建了几个对象????

 Integer i1 = new Integer(1);

 Integer i2 = Integer.valueOf(1);

 Integer i3 = Integer.valueOf(1);

 System.out.println(i1==i2+"---------------"+i2==i3); 结果打印什么???

 这些就留给大家自己想想好了,O(∩_∩)O哈哈~(都是常见的java基础题目)


这篇关于java方法传参方式---到底是传值还是传址,还是两者都不对!!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/747536

相关文章

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Python清空Word段落样式的三种方法

《Python清空Word段落样式的三种方法》:本文主要介绍如何用python-docx库清空Word段落样式,提供三种方法:设置为Normal样式、清除直接格式、创建新Normal样式,注意需重... 目录方法一:直接设置段落样式为"Normal"方法二:清除所有直接格式设置方法三:创建新的Normal样

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

Django中的函数视图和类视图以及路由的定义方式

《Django中的函数视图和类视图以及路由的定义方式》Django视图分函数视图和类视图,前者用函数处理请求,后者继承View类定义方法,路由使用path()、re_path()或url(),通过in... 目录函数视图类视图路由总路由函数视图的路由类视图定义路由总结Django允许接收的请求方法http

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布