Java面试题:

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

答案基本上是:值传递

说明:得出这种结论的前提必须是“参数的值就是对该对象的引用,而不是对象的内容

 

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行形式参数值的改变,不影响实际参数的值。

引用传递:也称为传地址。方法调用时,实际参数的引用(即地址,而不是参数的值)被传递给方法中相对应的形式参数,

在方法中执行对形式参数的操作实际上就是对实际参数的操作(地址操作),这样方法执行中形式参数值的改变将会影响实际参数的值。

 

值传递:基本数据类型作为参数(如:String,int)

public static void changeInt(int a, int b){
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
}

参数调用:

// int类型,值传递
int a = 123;
int b = 456;

printInt(a, b);
changeInt(a, b);
printInt(a, b);

执行结果:

a = 123; b = 456

a = 123; b = 456

 

引用传递对象或数组作为参数(如:Person,Array)

class Person{
	String name;
	int age;
	
	public Person(String name, int age){
		this.name = name;
		this.age  = age;
	}
	
	public void changePerson(Person person, String name, int age){
		person.name = name;
		person.age  = age;
	}
	
	public void printPerson(Person person){
		System.out.println("name = " + person.name + "; age = " + person.age);
	}
}

参数调用:

// 对象,引用传递
Person p = new Person("张三", 20);

p.printPerson(p);
p.changePerson(p, "李四", 30);
p.printPerson(p);

执行结果:

name = 张三; age = 20

name = 李四; age = 30

完整示例:

package com.val_ref;

// Person类
class Person{
    String name;
    int age;
    
    public Person(String name, int age){
        this.name = name;
        this.age  = age;
    }
    
    public void changePerson(Person person, String name, int age){
        person.name = name;
        person.age  = age;
    }
    
    public void printPerson(Person person){
        System.out.println("name = " + person.name + "; age = " + person.age);
    }
}

class iArray{
    
    public iArray(){

    }
    
    public void reverseArray(int []array){
        int tmp;
        int len = array.length;
        for(int i=0; i<len/2; i++){
            tmp = array[i];
            array[i]= array[len-1-i]; 
            array[len-1-i] = tmp;
        }
    }
    
    public void printArray(int []array){
        
        for(int i=0; i<array.length; i++){
            System.out.print(array[i] + "  ");
        }
        System.out.println();
    }
}


public class testValue {
    
    public static void main(String []args){

        // 对象,引用传递
        Person p = new Person("张三", 20);
        
        p.printPerson(p);
        p.changePerson(p, "李四", 30);
        p.printPerson(p);

        // 对象,引用传递
        int []array = new int[5];
        for(int i=0; i<array.length; i++){
            array[i] = i+1; 
        }
        iArray obj = new iArray();
        obj.printArray(array);
        obj.reverseArray(array);
        obj.printArray(array);
        
        
        // String类型,值传递
        String name1 = "张三";
        String name2 = "李四";

        printString(name1, name2);
        changeString(name1, name2);
        printString(name1, name2);

        // int类型,值传递
        int a = 123;
        int b = 456;

        printInt(a, b);
        changeInt(a, b);
        printInt(a, b);
    }
    
    // String类型
    public static void changeString(String name1, String name2){
        String tmpName;
        tmpName = name1;
        name1 = name2;
        name2 = tmpName;
    }

    public static void printString(String name1, String name2){
        System.out.println("name1 = " + name1 + "; name2 = " + name2);
    }
    
    // int类型
    public static void changeInt(int a, int b){
        int tmp;
        tmp = a;
        a = b;
        b = tmp;
    }

    public static void printInt(int a, int b){
        System.out.println("a = " + a + "; b = " + b);
    }
}

执行结果:

name = 张三; age = 20

name = 李四; age = 30

1  2  3  4  5

5  4  3  2  1

name1 = 张三; name2 = 李四

name1 = 张三; name2 = 李四

a = 123; b = 456

a = 123; b = 456

 

 

推荐参考:

java中的值传递和引用传递

Java 是值传递还是引用传递

java参数传递时到底是值传递还是引用传递

Java 的==和Equals比较

 

原文: Java值传递与引用传递

 

 

参考推荐:

Java 中 equals 和 == 区别

Java 的 == 和 equals 比较

Java int 和 Integer 区别

Java 中 string 和 int 互相转化

Java基本数据类型sizeof功能

Java8 新特性和改进总览

Java assertion介绍和用法

Java 类的生命周期详解

Java 数组转型和范型

Java 之String类型

Java 值传递与引用传递

Java 内存模型及GC原理

Spring 常见技术问题总结

Spring 编程技术的经典面试题

Apache httpd.conf 配置详解