按值传递和按引用传递

Java中只有按值传递,没有按引用传递!

package test;  
  
public class TestOne {  
      
    public static void name(int x){  
        x++;  
    }  
      
    public static void main(String[] args) {  
        int x = 0 ;  
        name(x);  
        System.out.println("------>x的值为: " + x);  
    }  
} 


运行结果 : ------>x的值为: 0 


public class PassbyValue {

	public void increment(String t) {
		t = "meili";
		System.out.println(t); // 输出为1
	}

	public static void main(String[] args) {
		String t = "美丽";
		PassbyValue ps = new PassbyValue();
		ps.increment(t);
		System.out.println(t);
	}
}



运行结果:meili
美丽


package test;  
  
class Cat{  
    int x = 0;  
}  
  
public class TestTwo {  
    public static void name(Cat cat){  
        cat.x++;  
    }  
      
    public static void main(String[] args) {  
        Cat c = new Cat();  
        name(c);  
        System.out.println("------>x的值为: " + c.x);  
    }  
} 


运行结果 : ------>x的值为: 1 



在Java只有按值传递,可能有人会奇怪传递进来如是对象,它会改变对象的值,例如:
Java代码 
public class Test{ 
   int i; 
   public void increment(Test t){ 
       t.i++; 
       System.out.println(i);   //输出为1 
   } 
   public static void main(String[] args){ 
       Test t = new Test(); 
       t.increment(t); 
       System.out.println(t.i); //输出也为1 
   } 


这的确是 改变了对象的值,但它并没有改变对象引用的值,它还是指向原来的对象,我们传递进来的是对象引用并不是对象,造成这种错误的认识主要是没有理解对象和对象引用的区别,我们可以将对象理解为气球,而对象引用可理解为拉着气球的线,所以这还是按值传递;

如果在方法中把对象(或数组)作为参数,方法调用时,参数传递的是对象的引用(地址),即在方法调用时,实际参数把对对象的引用(地址)传递给形式参数。这是实际参数与形式参数指向同一个地址,即同一个对象(数组),方法执行时,对形式参数的改变实际上就是对实际参数的改变,这个结果在调用结束后被保留了下来。


一般面试题中都会考Java传参的问题,并且它的标准答案是 Java只有一种参数传递方式:那就是按值传递,即Java中传递任何东西都是传值。如果传入方法的是基本类型的东西(值传递适用于Java中的八大基本数据类型和String),你就得到此基本类型的一份拷贝。如果是传递引用,就得到引用的拷贝。

总结:java中只要按值传递,参数是八大基本数据类型和String,值不改变,如果是其他,会改变
[/size]

你可能感兴趣的:(引用传递)