美文网首页
对象传参后值的变化

对象传参后值的变化

作者: 很很狠的狠角色 | 来源:发表于2017-10-19 20:05 被阅读0次
public class Problem01 {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new A();
        A a3 = new A();
        System.out.println(a1 + " " + a2);
        swap(a1, a2);
        System.out.println(a1 + " " + a2);
        System.out.println(a3.a);
        assignment(a3);
        System.out.println(a3.a);
    }

    private static void swap(A a1, A a2) {
        A a = new A();
        a = a1;
        a1 = a2;
        a2 = a;
        System.out.println(a1 + " " + a2);
    }

    private static void assignment(A aa) {
        aa.a = 8;
    }
}

class A {
    int a = 10;
}
代码运行结果

在java里传参传递的都是值:

  • 基本数据类型传递的是数据的值。调用者(方法体外部)和被调用者(方法体内部)用的是两个不同的变量,方法体内部的变量的改动不会影响方法体外部的变量。
  • 引用数据类型传递的是所引用的对象的地址的值。调用者(方法体外部)和被调用者(方法体内部)用的是两个相同的变量,方法体内部变量的改动会影响方法体外部的变量。
       java程序设计语言总是采用按值调用,方法得到的所有参数值都是变量的拷贝。基本数据类型传递的是数据本身的拷贝,引用类型传递的是引用所对应对象的地址的拷贝。
      数据传参想必大家都很熟悉了,那就看一下数据类型的引用传参。在assignment()方法体中传入的参数不是基本数据类型,是A类型的一个实例,从输出结果可以看到a的值发生了变化。
      再来看看引用传参。上面代码中swap(a1,a2)开始传递参数的时候,在swap方法的栈内存中就会出现方法外部对象a1和a2的所引用对象的地址值的复制体a1和a2.这时进行交换操作,致使方法体内部的a1实际引用的是外部的a2,内部的a2实际引用的是外部的a1。所以方法体内部打印a1和a2所引用的对象的值和外部的a1和a2是相反的,并且,外部的a1和a2的值在调用swap方法前后所引用的对象并没有变化。

总结:

  1. 一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)。
  2. 一个方法可以改变一个对象参数的状态。
    状态是指对象的实例域,比如,上面的a3.a就被改变了。
  3. 一个方法不能让对象参数引用一个新的对象。
    比如,上面的swap()方法就没改变a1和a2的引用对象。(但是不经过方法,直接在main()方法里用赋值语句就可以改变)

相关文章

  • 对象传参后值的变化

    在java里传参传递的都是值: 基本数据类型传递的是数据的值。调用者(方法体外部)和被调用者(方法体内部)用的是两...

  • 06|第六课:入参为HashMap和Mybatis调用存储过程

    一、历史回顾 (一)、历史回顾 1、对象传值 二、入参为HashMap和Mybatis调用存储过程 (一)、入参为...

  • iOS 形参传递的是什么?

    iOS形参传递的是什么? 你是否也有这样的困惑?当我将一个对象传给一个函数后,这个函数拥有值是原始对象,还是一个克...

  • 【问答】Java基础

    两个Integer的引用对象传给一个swap方法在方法内部交换引用,返回后,两个引用的值是否会发现变化? 不会。J...

  • C#基础之 Struct和Class的区别

    基本的区别:Struct的对象传值,Class的对象传引用。 特殊区别:MetadataTypeAttribute...

  • Ajax List对象传参

    第一:构造适用于Spring的List对象参数 第二:页面构键一个虚拟的表单,你可以隐藏起来,提交表单 javaS...

  • vue-router

    vue传参两种方式 1、对象传参2、路径传参 vue路由两种模式 1、hash模式 onhashchange2、h...

  • vue2.0响应式原理

    检测数据变化 当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对...

  • 2、SpringBoot和Mybatis的集成练习

    关于参数 1、路径参数 2、? 传参 3、json对象传参 实战(进行数据库表的增删改查) pom配置文件 连接数...

  • dayTwo SpringBoot和Mybatis的集成练习

    关于参数 1、路径参数 2、? 传参 3、json对象传参 实战(进行数据库表的增删改查) pom配置文件 连接数...

网友评论

      本文标题:对象传参后值的变化

      本文链接:https://www.haomeiwen.com/subject/yldpuxtx.html