Java的传值机制

Posted hbc314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的传值机制相关的知识,希望对你有一定的参考价值。

不管多好的总结都比不上一段代码

我们先来看看基本类型的实例变量的传值机制

创建一个Student类

 1 public class Student {
 2     int age=18;
 3     String name="Jack"; 4 }

尝试将基本类型实例变量age当做参数传入方法,在方法内修改参数的值,从而修改age的值

构造一个changeAge方法

1 public void changeAge(int in) {
2         in=0;
3     }

 在main方法中实例化一个Student对象stu,调用changeAge方法来改变stu的age

1      Student stu=new Student();
2         System.out.println("尝试改变前stu的age:"+stu.age);
3         stu.changeAge(stu.age);
4         System.out.println("尝试改变后stu的age:"+stu.age);

运行结果:

  • 尝试改变前stu的age:18
  • 尝试改变后stu的age:18

发现age的值没有改变,猜想传入方法中的参数只是age的一个副本而不是age本身

在main方法中直接更改age

1   System.out.println("尝试改变前stu的age:"+stu.age);
2   stu.age=0;
3   System.out.println("尝试改变后stu的age:"+stu.age);

运行结果:

  • 尝试改变前stu的age:18
  • 尝试改变后stu的age:0

age发生了改变,证明是传入时出了问题,传的是副本。

我们再来看看引用类型的实例变量的传值机制

尝试将引用类型实例变量name当做参数传入方法,在方法内实例化一个新的对象并将该对象的地址传给参数,从而修改name的指向

构造一个changeName方法

public void changeName(String str) {
        String temp="null";
        str=temp;
    }

在main方法中调用changeName方法来改变stu的name

1         System.out.println("尝试改变前stu的name:"+stu.name);
2         stu.changeName(stu.name);
3         System.out.println("尝试改变后stu的name:"+stu.name);

运行结果:

  • 尝试改变前stu的name:Jack
  • 尝试改变后stu的name:Jack

发现name并没有改变,指向的仍旧是原来的那个对象,猜想传入方法的参数不是name本身而是name的一个副本(也就是地址的一个副本)。

在main方法中直接更改name

1      System.out.println("尝试改变前stu的name:"+stu.name);
2         stu.name=("null");
3         System.out.println("尝试改变后stu的name:"+stu.name);

运行结果:

  • 尝试改变前stu的name:Jack
  • 尝试改变后stu的name:null

name发生了改变,证明是传入时出了问题,传的是地址的一个副本。

代码一顿操作后来个总结是再好不过了

  以上所有操作只说明一个结果:Java中传参是值传递,传入方法的只是一个copy。传基本类型的变量时传的是数据的一个copy,传引用类型的变量时传的是地址的一个copy。此时注意引用类型的变量承载的只是对象的地址而不是对象本身哦!

  另(可视而不见):注意静态变量的与众不同,改变一个对象的静态变量就相当于改变所有哦。这时候如果使用对象来调用静态变量很容易造成混淆,毕竟它是属于类的。

以上是关于Java的传值机制的主要内容,如果未能解决你的问题,请参考以下文章

javaweb中页面间的传值问题。求助!

java的传值方式

java数组的赋值机制

java数组的赋值机制

java Java的传值

Android JNI浅析Java和Native通信对象的传值和回调