`

关于程序语言中的参数传递

阅读更多

  关于程序语言中的值传递问题很是让人迷惑,在此,更具自己的理解,以C语言和java语言为例来阐述一下参数传递。
    c语言中,参数传递方式有有三种:值传递,指针传递以及引用传递。
    java语言中有两种:值传递以及引用传递。
    java语言中的参数传递和c语言中的参数传递机制不太一样,即使传递方式名称一样可是最后效果还是有区别!
    对于值传递,它们的效果都是一样的,只是java中只允许对基本数据类型进行值传递;而在c语言中,值传递针对的数据类型可以使除了数组之外的所有类型(c语言中的数组类型参数传递都是指针传递)!
    由于在java中没有指针的概念,因此java中的对出了基本数据类型之外的传递都是引用传递,但是这里我发现一个小的区别和c语言中的区别:
比如下面的例子:
package test;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class PersonT {
  static final Log log = LogFactory.getLog(PersonT.class);
    public void change(Person p) {
        p.name = "mary";
        p.age = 20;
    }

    public void changeInt(int i) {
        i = 8;
    }
//有返回值的方法
    public Person change1(Person p){
//新建对象,name为tpm,age为22
       p = new Person("tom",22);
       return p;
    }
//没有返回值的方法
    public void change1(Person p){
//新建对象,name为tpm,age为22
       p = new Person("tom",22);
      
    }
    public static void main(String[] args) {
        PersonT t = new PersonT();
        Person p = new Person("john", 18);
        Person p1 = p;
        log.info(p1.age);
//通过方法改变对象属性值
        t.change(p1);
        log.info(p1.age);
        log.info("传回来的值指向是否一致:" + p.equals(p1));
//通过方法改变整数值
        int i = 10;
        log.info("i值为:" + i);
        t.changeInt(i);
        log.info("i值为:" + i);
//新建一对象,改变对象值
      p=  t.change1(p);
        log.info("传回来的值指向是否一致:" + p.equals(p1));
        log.info(p.age);
    }

}
输出结果:
2009-09-19 10:02:41 [日志信息] 18
2009-09-19 10:02:41 [日志信息] 20
2009-09-19 10:02:41 [日志信息] 传回来的值指向是否一致:true
2009-09-19 10:02:41 [日志信息] i值为:10
2009-09-19 10:02:41 [日志信息] i值为:10
2009-09-19 10:02:41 [日志信息] 传回来的值指向是否一致:false
2009-09-19 10:02:41 [日志信息] 22//方法有返回值的时候的
2009-09-19 10:02:41 [日志信息] 20//方法没有有返回值的时候的
大家可以看到:当你在一个方法中创建一个对象,并把这个对象赋值给传递的参数时,如果在c语言中(前提是引用传递),不论是否又返回值,应该都会修改其指向的内存单元,但是在java中只有当此方法又返回值时候才修改其指向的内存单元,否则,其指向的内存单元不会改变即使赋值不起作用!但是但你在方法中修改其属性时却可以,我想这肯定是它们在java内部做了一些处理!
   它的作用很明显:不允许你在方法体中对参数对象重新赋值,只允许你在方法体中对参数对象的属性进行修改!

分享到:
评论
3 楼 patrickyao1988 2009-09-19  
你说的也对 但我觉得还是有些许问题(如果我没理解错的话)
“(在一个方法中创建一个对象....)但是在java中只有当此方法又返回值时候才修改其指向的内存单元,否则,其指向的内存单元不会改变即使赋值不起作用!”
从结果来看,这是对的,但实际上不是这样,即便传的是引用,也就是阁下说的“传递的是值所在内存区域的地址”,其实也是传的该值的拷贝,因此如果调用传进来的参数(某个对象的引用)的方法,那么这个拷贝跟原引用指向的是同一个对象实体,因此不用返回值就可以改变该对象,但如果新建对象,比如在方法中arg=new XXXX();那么该参数的值已经变成新建的对象的引用,跟传进来的那个原先的引用一点关系也没有了,他进行的操作,比如arg.setXXX();改变的是新建的对象的属性,所以,如果不返回,那么这个方法内的局部对象变量将没有意义,看起来像是这个操作不起作用
2 楼 jasstion 2009-09-19  
我还是觉得把他们区别开叫更好一些,你说的也对,都是传值,但是一个传递的是值的拷贝,另一个传递的是值所在内存区域的地址,为了表达出这种区别,程序中使用了值传递和引用传递;我想java语言的底层实现也是C语言;还是个人看法的习惯不同,就是这个值的理解不同,如果你认为是字节信息那么可定都是一样的。
1 楼 patrickyao1988 2009-09-19  
"java语言中有两种:值传递以及引用传递。"
这句话还是不要再说了,虽然有过C经历的阁下还是可以区分所谓的值传递和引用传递,
但我记得james gosling(不知道这个拼对没有)说过,(事实上也确实是这样),java中都是pass by value ,即传值,关键要弄清,传的是什么值。只要记住都是pass by value,其实就可以搞清楚了,没必要整那么复杂

相关推荐

    易语言多线程传递多参数

    易语言是一种中文编程语言,旨在降低编程门槛,让普通用户也能进行程序开发。本文将深入探讨易语言中的多线程以及如何传递多个参数。 一、多线程基础 多线程是指一个程序内可以同时执行多个独立的执行流,每个执行...

    Java语言中参数值传递和引用传递比较.pdf

    Java 语言中参数值传递和引用传递是两种不同的参数传递方式,它们在 Java 编程中扮演着重要的角色。参数值传递是指将实际参数的值复制给形式参数,形式参数的变化不影响实际参数的值。引用传递是指将实际参数的引用...

    主程序与子程序之间的参数传递实验.pdf

    我们了解了如何使用汇编语言编写子程序,并如何使用参数传递来实现子程序的调用和数据传递。 实验步骤: 1. 上机验证所选题目,并做相应测试和分析。 2. 进行实验分析。 3. 总结指针及其程序设计、实现方法和经验...

    java语言中的参数传递

    Java 语言中的参数传递是一个关键概念,它涉及到方法调用时如何传递数据。Java 有两类参数传递方式:按值传递(by value)和按引用传递(by reference),虽然 Java 没有真正的按引用传递,但其效果类似于 C++ 或 C#...

    c++中参数传递方式讨论

    在C++编程语言中,参数传递是函数调用过程中一个至关重要的概念,它决定了函数如何接收外部传入的数据。根据给定的文件信息,我们将深入探讨C++中的三种主要参数传递方式:值传递、指针传递和引用传递,并分析它们的...

    C语言程序设计中函数参数传递的研究.pdf

    数组作为一种数据类型,在完成函数参数传递时,编译系统会将形参数组处理为指针变量,所以数组在参数传递中与指针传递是相同的。 函数调用中参数传递的本质是函数调用时,实参和形参存放在两个不同的存储单元中。...

    JSF中文教程+JSF参数传递方式

    3. **事件参数传递**:JSF支持事件驱动的编程模型,如`valueChange`事件。当用户界面组件的值发生变化时,可以触发事件并传递参数。你可以定义一个监听器方法来处理这些事件,参数通常会作为方法的输入。 4. **EL...

    c# 参数传递,参数调用

    在C#编程语言中,参数传递和参数调用是核心概念,它们关乎着函数和方法如何接收和处理数据。理解这些概念对于编写高效且可维护的代码至关重要。本篇文章将深入探讨C#中的参数传递机制及其应用。 首先,我们要了解...

    C C++语言函数参数传递及函数调用约定的探讨

    理解和掌握C/C++语言中函数参数传递的方式及其调用约定对于编写高效可靠的程序至关重要。通过合理选择参数传递方式(值传递或地址传递)和合适的函数调用约定,可以显著提高程序的性能和可维护性。

    C#与MATLAB之间传递参数

    C#和MATLAB是两个不同的编程语言,C#是微软公司开发的面向对象的高级编程语言,而MATLAB是MATLAB公司开发的高性能数值计算语言。两者之间的数据传递是非常重要的,因为在实际应用中,我们经常需要将C#和MATLAB结合...

    易语言DLL传递数组测试程序源码,易语言向DLL传递数组参数的实现

    易语言是一种专为中国人设计的编程语言,它以简明直观的中文语法为特色,使得初学者能够更容易地学习编程。在易语言中,与DLL(动态链接库)交互是常见的操作,尤其在处理系统级功能或者调用其他语言编写的函数时。...

    单片机子程序的参数传递与相容性设计.pdf

    子程序的参数传递与相容性设计是单片机汇编语言编程的关键,直接关系到程序的正确运行、代码的可维护性和系统性能的优劣。本文详细讨论了单片机子程序的参数传递方法和子程序间的相容性设计。 首先,子程序参数传递...

    线程传递参数

    在多线程编程中,有效地传递参数是实现并发任务的关键技术之一。这使得各个线程能够根据特定的数据执行各自的任务,提高...理解并熟练掌握不同编程语言中线程参数传递的方法,对于编写高效、稳定的多线程程序至关重要。

    VS2010 C++窗口应用程序窗口之间传递参数的实例

    理解并熟练运用这些知识点,能帮助开发者在VS2010的C++环境中有效地进行窗口间参数传递,避免潜在的内存问题,提高代码质量和稳定性。通过深入学习和实践,可以进一步掌握C++/CLI和其他.NET技术,增强跨平台和跨语言...

    frame之间进行参数传递例子

    1. **基本参数传递方式**:在编程中,参数传递主要有三种方式:值传递、引用传递和按需传递(在某些语言中)。值传递会复制原始值到新的内存空间,修改副本不会影响原始值;引用传递则传递的是对象的引用地址,改变...

    C#编写的一个高级语言程序——值传递2

    在编程领域,C#是一种广泛使用的面向对象的高级编程语言,由微软公司开发并应用于.NET框架。本主题将深入探讨C#中的值传递机制,这是理解函数参数传递的基础,对于编写高效、可靠的代码至关重要。 值传递是C#中函数...

    VC向Vb传递命令行参数.rar_传递参数

    标题“VC向Vb传递命令行参数.rar_传递参数”指出,这个压缩包包含了一个关于如何在VC中创建程序,并将命令行参数传递给VB应用程序的示例。这个过程对于需要交互或整合两个不同编程环境的应用程序来说很有用。 首先...

    关于C语言的参数传递问题

    在C语言中,参数传递是函数调用时传递数据给函数内部使用的一种机制。它分为两种主要方式:值传递和地址传递。 1. 值传递(Value Passing) 值传递是最常见的参数传递方式,它意味着函数接收的是实参(实际变量)的...

Global site tag (gtag.js) - Google Analytics