Java 函数的参数说

java函数参数传递的到底是值还是引用对确实容易让人迷糊。而很多时候因为对这个问题的模糊甚至造成一些错误。最常见的说法是基本类型传的是值,对象传的引用。对于基本类型,大家都达成共识,没有什么可以争论的。但对于对象传递,还有一说是也是值传递。首先来看一个例子。一个简单类person,只有一个属性name,和一个人事系统。如下所示:

public class Person{

    private String name;

    public Persion(String name){
        this.name = name;
    }

    public String getName(){
        return this.name;
    }
    public void setName(String name){
        this.name = name;
    }
}  
public class PersonnalSystem{

    public static void changeName1(Persion person){
        person.setName("Bob");
       System.out.println("person name in changeName1: " person.getName());// Bob,被修改了
    }
  public static void changeName2(Persion person){
        Person anotherPerson = new Persion("Tom");
        person = anotherPerson;
       System.out.println("person name in changeName2: " person.getName());// Tom被修改了
    }

    public static void main(String[] agrs){
        Person person = new Persion("Lily");
        System.out.println("before change name person‘s name is"+person.getName);//Lily
        changeName2(person);
        System.out.println("after first change name person‘s name is"+person.getName);//被修改Bob
        changeName2(person);
        System.out.println("after second change name person‘s name is"+person.getName);//仍然是Bob,没有修改
    }
}      

运行这个程序可以看到,changeName1修改了person的名字,确实是传递引用。但是当把person传递到changeName2中虽然在方法内修改成功,但main函数中仍然是Bob没有修改。这似乎又是传值了。这是因为,对象传递过程中传递的是对象的地址,而非对象的引用,也不是对象的副本。假设刚开始person的地址为60,changeName1接收到的参数是地址60,所以修改是在地址60的地方进行的,因此对象改变。而在changeName2中新建anotherPerson的地址也许是65,但绝非是60.当把anotherPerson赋值给person时,只是将person所代码的60改变成65,后续的修改操作都是在65处进行的,因此对main(60)中的person无影响。

所以总之来说我认为java参数传递过程是值传递。

  1. 基本类型传递值
  2. 引用类型传递的还是值,只不过是对象地址值,而非对象或副本。

这种方式对于String,Integer, Double等immutable类型时,也是符合的。因为这些对象不可变,因此每次传递的都是值。当然如果非要认为对象是引用传递也未尝不可,但是首先要区别String这类不可变对象,其次还要主义changeName2这种情况下千别希望原来对象被改变。

时间: 2024-10-23 23:05:55

Java 函数的参数说的相关文章

[Java]_函数传参的疑惑与思考

问题来源于leetcode上的两道题 Path Sum I && II,分别写了两个dfs. 1 void dfs(TreeNode node , int sum , ArrayList<Integer> curPath) 2 void dfs(TreeNode node , int sum , boolean ifExist) 问题:在1号中我可以在方法中修改curPath,在结束函数调用时,变量修改仍然生效.   在2号问题中,我即使在函数中修改了ifExist,结束函数调

Java函数的传参机制

一 最近的一个项目,里面各种返回void,参数用引用类型,那叫一个熟和多,但是也把我绕糊涂了. 我就打算好好理一理java的传参机制,整理一番 二 很多人一听Java的传参,那一定会脱口而出,java都是值传递的.恭喜各位,答对了. 那么,传的是什么值? 如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的.如果在函数中改变了副本的值不会改变原始的值. 如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地

Java函数参数传递方式详解

在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. 按引用传递的? C. 部分按值部分按引用? 此处暂不宣布正确答案,我们通过一个简单的例子让大家自己找答案: 1. 先定义一个类型Value Java代码   public static class Value { private String value = "value"; public String getValue() { return value; } pub

JS调用Java函数--DWR框架

(1)dwr与ssh框架整合教程dwr框架介绍. DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许 在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样.它包含两个主要的部分:允许JavaScript从WEB服务器上一 个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动

Integer 函数传参实现值交换

import java.lang.reflect.Field; public class MainClass { public static void main(String[] args) { Integer a = 128; Integer b = -129; swarp(a,b); System.out.println(a); System.out.println(b); try { System.out.println("_________________________________

关于函数传参--传指针,传引用

今天和同学讨论到指针和引用的传递问题,有些想法从推理上讲是正确的,但是因为是推理,说出自己观点的时候不是那么有底气,本着实践是检验真理的唯一标准的原则,在电脑上敲了几段代码,验证了推理的正确性. 先上代码,再分析. 代码1: void Swap0(int a1,int b1){ int temp; temp=a1; a1=b1; b1=temp; } void Swap1(int *a1,int *b1){ //交换地址 int *temp; temp=a1; a1=b1; b1=a1; } v

初学JAVA函数

  函数是定义在类中的具有特定功能的小程序,函数也称为方法(将功能代码封装,便于对该功能进行服用,只有被调用施才会被执行) 静态函数所调用的被调用函数也必须是静态. 格式: 修饰符返回值类型函数名(参数类型形式参数1,参数类型形式参数2) { 执行语句: Return 返回值: } 特殊情况:功能没有返回值时,return的后面直接用分号结束,因为没有具体返回值,所以此时的返回值类型用void来表示. 函数提高了代码的复用性. class test617 {        public stat

sizeof对函数入参使用不准

被调用函数内部,无法知道入参的字符数组的可用内存长度 所以函数字符指针作为入参时,一定要加一个 此指针指向的内存空间长度入参int nSize 错误的写法: 1 #include "stdafx.h" 2 #include <string.h> 3 #include <stdarg.h> 4 5 // 返回非0表达式验证不通过,不用调用子系统功能号 6 int getFilters(char * pszInput, char *pszFuncid) 7 { 8

python函数传参是传值还是传引用?

首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-