(转载)图解Java中的参数传递

今天做项目,发现了一个问题,当String作为参数传递的时候,在函数内部改变值对外部的变量值无影响,如下代码:

 public static void main(String[] args) {
        String str = "11111";
        changeStr(str);
        System.out.println(str);//输出11111
    }
    public static void changeStr(String str){
        str = "22222";
    }

一开始不解后来想想就明白了,遂去对java参数传递做一个总结,以加深自己的基础知识.

1.基本类型传递

对于:

  • 整型: byte short int long
  • 浮点型 float double
  • 逻辑型 boolean
  • 字符型 char
    四类八种基本类型来说,传递的都是值,因为这些值是直接保存在栈内存中的,所以传递的时候直接拷贝过去了.
public static void main(String[] args) {
        int num = 0;
        change(num);
        System.out.println(num);//输出0
    }
    public static void change(int numChange){
        numChange =5;
    }

结构如下图,也因此最外层的num的值并没有受到影响.


2.对象传递

2.1 例一

对象传递,本质上也都是值传递,只不过传递的值是该引用的拷贝.看下面实例和图解:

 public static void main(String[] args) {
        Person person = new Person("aaa", 11);
        change(person);
        System.out.println(person);//输出 bbb 11
    }
    public static void change(Person personChange){
        personChange.setName("bbb");
    }

结构图如下:
当执行change的时候,会把person变量的指向的地址拷贝一份给personChange,两者都指向同一个堆内存,即使后面做了set方法修改,但是对两者的执行毫无影响.


2.2例二

例二和之前的不同之处在change里面,对personChange进行了new操作.代码如下:

public static void main(String[] args) {
        Person person = new Person("aaa", 11);
        change(person);
        System.out.println(person);//输出 aaa 11
    }
    public static void change(Person personChange){
        personChange = new Person("bbb",12);
    }

结构图如下:
当执行change的时候,会把person变量的指向的地址拷贝一份给personChange,两者都指向同一个堆内存,接下new操作会在堆中重新创建一个person对象,此时personChange则指向这个对象,而原person的指向没发生变化,故输出aaa 11.


2.3 例三

例三是综合例一和例二,前面两个搞懂的话这个就很容易懂了.

 public static void main(String[] args) {
        Person person = new Person("aaa", 11);
        change(person);
        System.out.println(person);//输出 ccc 11
    }
    public static void change(Person personChange){
        personChange.setName("ccc");
        personChange = new Person("bbb",12);
    }

结构图如下:
读者自己理解下,不懂的话再看看前面的,看看为什么输出CCC 11

2.4特殊的String

终于到最初的问题,为什么String是对象,但是却不符合上面对象传递测试出来的结果?

 public static void main(String[] args) {
        String str = "11111";
        changeStr(str);
        System.out.println(str);//输出11111
    }
    public static void changeStr(String str){
        str = "22222";
    }

原因:
因为String对象具有不可变性,所以针对操作str = "22222",在String池中不存在的时候,就是相当于str = new String(),这样变化下的话,那么就和例一 一模一样了,具体图就不画了,希望对你有帮助.

3.总结

要理解上面的结果,就要认为Java中只有值传递:

  • 对于基本类型,直接拷贝值传递过去
  • 对于对象,拷贝当前对象的引用地址,然后把该地址传递过去,所以也是值传递.

原文链接:https://zhuanlan.zhihu.com/p/24556934?utm_source=qq&utm_medium=social

时间: 2024-07-28 15:55:19

(转载)图解Java中的参数传递的相关文章

Java中函数参数传递和数据存储

值传递是将要传递的值作为一副本传递的..引用传递,传递的是引用对象的内存地址..例如: int i=4;  int j=i;   //相当于把4复制了一个副本赋给了j 输出结果是i=4 ,j=4 Cint *p,*p1;int j=5;p=j;    //这里是把j在内存当中的地址赋给了指针pp1=p;   //这里是把指针p中保存的地址(就是j的地址)赋给了指针p1 j=4;    //这里改变j的值 输出结果是  j=4  ,  *p=4  ,  *p1=4  //因为p和p1指向的都是j

转载:浅析Java中的final关键字

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3736238.html 一.final关键字的基本用法 在J

Java语言中的参数传递

在实际的开发过程中,方法调用是一种很常见的操作,在方法调用中,关于参数的处理可能很多进行实际开发的程序员都不一定理解的很清楚,下面系统的介绍一下Java语言中参数传递的规则,以及和参数传递相关的一些问题. 和其它程序设计语言类似,Java语言的参数传递也分为两种: 1.按值传递(by value) 适用范围:8种基本数据类型.String对象 特点:在内存中复制一份数据,把复制后的数据传递到方法内部 作用:在方法内部改变参数的值,外部数据不会跟着发生改变 2.按址传递(by address) 适

string-关于java中String类型参数传递的问题,谁能给我讲清楚

问题描述 关于java中String类型参数传递的问题,谁能给我讲清楚 我知道java里面参数传递是值传递,这点不用给我解释了.但是: import java.util.*; public class Test { public static void change(String s){ s="2"; } public static void main(String[] args) throws Exception{ String s="1"; change(s);

关于java中使用jacob调用c++写的ocx时参数传递的问题

问题描述 我用c++写了一个简单的ocx写了3个方法TestFunc()TestFunc3(SHORTport)TestFunc2(SHORTport,CHAR*strIP)在java中这么调用ActiveXComponentcomx=newActiveXComponent("ACEWEB.ACEWebCtrl.1");Dispatchdisp=comx.getObject();Dispatch.call(disp,"TestFunc");Dispatch.call

简单谈谈Java中String类型的参数传递问题_java

提要:本文从实现原理的角度上阐述和剖析了:在Java语言中,以 String 作为类型的变量在作为方法参数时所表现出的"非对象"的特性. 一.最开始的示例 写代码最重要的就是实践,不经过反复试验而得出的说辞只能说是凭空遐想罢了.所以,在本文中首先以一个简单示例来抛出核心话题: public class StringAsParamOfMethodDemo { public static void main(String[] args) { StringAsParamOfMethodDem

java 中函数的参数传递详细介绍_java

 java中函数的参数传递 总结:   1.将对象(对象的引用)作为参数传递时传递的是引用(相当于指针).也就是说函数内对参数所做的修改会影响原来的对象.   2.当将基本类型或基本类型的包装集作为参数传递时,传递的是值.也就是说函数内对参数所做的修改不会影响原来的变量.   3.数组(数组引用))作为参数传递时传递的是引用(相当于指针).也就是说函数内对参数所做的修改会影响原来的数组.   4.String类型(引用)作为参数传递时传递的是引用,只是对String做出任何修改时有一个新的Str

Java中参数传递类型只有值传递

Java核心技术卷I里有一个结论我觉得挺有意思的:java中没有引用传递,只有值传递 首先看定义: 值传递,是指方法接收的是调用者提供的值 引用传递,是指方法接收的是调用者提供的变量地址 以前学习C++时把参数传递分为值传递和引用传递,国内的不少java教材愿意把对象的传递理解是引用传递,为什么它们会这么说呢?可以看下面一个例子: import java.util.Calendar; public class ChangeValue { public static void main(Strin

分析java中clone()方法 (转载+修改)

  Java中的clone() 方法 java所有的类都是从java.lang.Object类继承而来的,而Object类提供下面的方法对对象进行复制.  protected native Object clone() throws CloneNotSupportedException; 这个javabean必须实现一个标识接口,Cloneable,表明这个javabean支持复制,如果没有实现这个接口,而调用clone()方法,编译器就会抛出CloneNotSupportedException