首先下定论java都是值传递,
一般纠结这个问题都会知道java的基本类型和对象引用 这时候需要知道最基本的内存模型简化理解就是栈堆
简单的说java中,新创建的实体对象在堆内存中开辟空间,而引用变量在栈内存中开辟空间
仅讨论这种引用传递的说法,其他传递都是不会造成被调用方法值的改变
//如果直接改引用的对象则会造成test和method方法的变量修改
@Test
public void test(){
Person person = new Person("232",222);
System.out.println(person);
ttttt(person);
System.out.println(person);//第二次打印会使用下面赋值的22333
}
//传递过来的nn会指向被调用的变量,然而如果调用.set会修改原变量的值,但是如果new则只会改变栈里面的引用不会改变外部调用
public void method(Person nn){
//nn = new Person("2222", 11);
nn.setAge(22333);
System.out.println(nn);
}
// 如果调用的方法new另一个对象则不会改变test方法的对象,仅仅改变method方法
@Test
public void test(){
Person person = new Person("232",222);
System.out.println(person);
ttttt(person);
System.out.println(person);
}
//传递过来的nn会指向被调用的变量,然而如果调用.set会修改原变量的值,但是如果new则只会改变栈里面的引用不会改变外部调用
public void method(Person nn){
nn = new Person("2222", 11);//该方法在方法内部的nn变量重新new对象于堆内存且重新定义了nn引用地址
//nn.setAge(22333);
System.out.println(nn);
}
这就是误认为java是引用传递的原因