话不多说直接上实例
测试代码块:
public class Test {
public static void main(String[] args) {
Animal tiger=new Animal("老虎");//创建老虎对象,年龄
Animal lion=new Animal("狮子");//创建老虎对象,年龄
System.out.println("change之前tiger: "+tiger);
System.out.println("change之前lion: "+lion);
change(tiger,lion);
System.out.println("change之后tiger: "+tiger);
System.out.println("change之后lion: "+lion);
}
public static void change(Animal animal1,Animal animal2){
//当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变
animal1.name="老虎儿子";
//但在方法内部对对象引用的改变是不会影响到被调用者的
animal2 =new Animal("狮子儿子");//引用改变 指向新的对象 "狮子儿子"
System.out.println("**********************change结束**************************");
}
}
控制台打印结果:
总结
Java语言的方法调用只支持参数的按值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但在方法内部对对象引用的改变是不会影响到被调用者的。C++和C#中可以通过传引用或传输出参数来改变传入的参数的值。在C#中可以编写如下所示的代码,但是在Java中却做不到。
c#代码块:
using System;
namespace CS01 {
class Program {
public static void swap(ref int x, ref int y) {
int temp = x;
x = y;
y = temp;
}
public static void Main (string[] args) {
int a = 5, b = 10;
swap (ref a, ref b);
// a = 10, b = 5;
Console.WriteLine ("a = {0}, b = {1}", a, b);
}
}
}
说明:Java中没有传引用实在是非常的不方便,这一点在Java 8中仍然没有得到改进,正是如此在Java编写的代码中才会出现大量的Wrapper类(将需要通过方法调用修改的引用置于一个Wrapper类中,再将Wrapper对象传入方法),这样的做法只会让代码变得臃肿,尤其是让从C和C++转型为Java程序员的开发者无法容忍。