java中究竟是值传递仍是引用传递

这个问题不用考虑太复杂,答案是值传递。
首先java中的数据类型有两种:基本类型和引用类型java

基本类型的传递举个栗子:web

public class App 
{
    public static void main( String[] args )
    {    	
    	Integer i = 10;
    	changeInteger(i);
    	System.out.println(i);
    }
    
    public static void changeInteger(Integer j) {
    	j++;
    	System.out.println(j);
    }
}

输出:svg

11
10

基本类型的传递是将值拷贝一份传给方法体做为入参,这份拷贝在方法体内的任何操做都不会影响以前值得改变。因此基本类型是值传递。code

引用类型:xml

public class App 
{
    public static void main( String[] args )
    { 
    	Student student = new Student();
    	student.setName("fujian");
    	student.setClassName("class 2");
    	changeStudent(student);
    	System.out.println(student.toString());
    }
    
    public static void changeStudent(Student student) {
    	student.setName("changed");
    	student.setClassName("class 3");
    	System.out.println(student.toString());
    }  
}

输出:对象

name is changed and className is class 3
name is changed and className is class 3

引用类型是内存地址的传递,将以前student引用指向的内存地址传递给方法做为入参,方法体内对入参的修改操做是对以前内存地址上的对象的操做,因此会改变以前对象的属性,引用类型仍是值传递,只是传递的是内存地址。内存

接下来看个栗子继续讲引用传递it

public class App 
{
    public static void main( String[] args )
    { 
    	Student student = new Student();
    	student.setName("fujian");
    	student.setClassName("class 2");
    	changeStudent(student);
    	System.out.println(student.toString());
    }
    
    public static void changeStudent(Student student) {
    	student = new Student();
    	student.setName("changed");
    	student.setClassName("class 3");
    	System.out.println(student.toString());
    }
}

输出:class

name is changed and className is class 3
name is fujian and className is class 2

能够看到方法体内的一系列动做:起初将fujian这个student对象的内存地址值传递给方法体的形式参数name,而后name又指向了新的student的内存地址,因此以后的一系列操做均是操做的新的student的内存地址上的对象,不影响fujian这个对象。webkit

总结: java是值传递,基本类型是值拷贝的传递,引用类型是内存地址的值传递。