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

  关于程序语言中的值传递问题很是让人迷惑,在此,更具自己的理解,以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内部做了一些处理!
   它的作用很明显:不允许你在方法体中对参数对象重新赋值,只允许你在方法体中对参数对象的属性进行修改!

发布了17 篇原创文章 · 获赞 4 · 访问量 5665

猜你喜欢

转载自blog.csdn.net/jasstion/article/details/83461867
今日推荐