java的参数传递问题。

来源:互联网 发布:网络高级工程师上课图 编辑:程序博客网 时间:2024/05/01 19:46

我们在使用一门语言的时候经常的要遇到的一个问题就是参数的传递,每一种语言有不同的传递方式,但是一般的来说,参数的传递有两种情况,第一是把参数的值得一个拷贝传入函数中,称为值传递。第二就是把参数的引用地址传进函数,称为引用传递。他们的具体区别是, 值传递你在函数中如果改变了参数的值,当离开这个函数的时候值不会改变,但是引用传递,在你离开函数之后,你的参数的值会发生改变。

现在我们再来研究一下java的方法的参数传递的方式是什么样子的,我们先写一个小例子。

Test.java

public class Test

{

       int i = 0;

      public void f(int x)

{

x++;

}

public static void main(String[] arg)

{

Test t = new Test();

System.out.println("这是没有调用f方法前的值" + t.i);

t.f(t.i);

System.out.println("这是调用f方法后的值" + t.i);

}

}

我们通过上边的代码可以知道,在我们调用方法之后类的属性值i并没有改变,这样看起来还像是我们说的值传递,其实这就是值传递,但是还有例外的情况会发生哦。,我们现在来看下边的一段代码。

public class Test

{

{

       A a = new A();

      public void f(A x)

{

x.i++;

}

public static void main(String[] arg)

{

Test t = new Test();

System.out.println("这是没有调用f方法前的值" + t.a.i);

t.f(t.a);

System.out.println("这是调用f方法后的值" + t.a.i);

}

calss A

{

int i=0;

}

你运行一下会发现什么,原来两次的输出的结果不一样了,这是为什么拿?

 原来,java的参数的传递是要遵循这样的一个要求的,那就是如果参数是基本的数据类型的话就是值传递,如果参数是对象的话就要是引用传递了,现在问题又来了,加入我们在一个方法是递归的方式,但是传入的参数是对象,在方法中我们要不断地改变参数的值,来实现递归,但是在返回的时候要求原来的对象没有发生该变,这样的时候我们要如何做那,简单的做法是声名一个新的对象,在八当前的对象的值传个它,比如新对象=旧对象,其实这种方法是错误的,这只是把老对象的地址传给了新的对象,你改变后老的对象的值就发生改变了,我们以应当使用的方法是new 一个新的对象,然后再一次他的各个属性的值通过老对象得到后富余他们就可以了,如果这个对象的东西很多的话我们就要花很多的代码类似实现这个功能,这是不是很麻烦哪,我们当然有更好的方法来实现的。

我们知道,我们建立的类都是Object的子类,Object又一格方法是copy,大部分是时候我们没有实现他,按照向上转型的情况,我们可以把所有的类都向上转型成为Object对象的,所以,我们可以发该Object 的copy方法,其实也死很简单的,在该方法内只需要一句话就可以了,super.copy();这样,在我么使用的时候就会实现创建自身对象的一个发本的,是不是很简单啊。

原创粉丝点击