当一个对象被当作参数传递给一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,到底是值传递,还是引用传递?
答案:是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个
参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调
用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++和 C#中可以
通过传引用或传输出参数来改变传入的参数的值。
理解下
值传递(pass by value)是指在调用方法时将实参复制一份传递到方法中,这样当方法对形参进行修改时不会影响到实参。
引用传递(pass by reference)是指在调用方法时将实参的地址直接传递到方法中,那么在方法中对形参所进行的修改,将影响到实参。
形参:定义方法名和方法体的时候使用的参数,目的是用来接收调用该方法时传入的参数。
实参:调用有参方法时传入的参数,方法名后面的括号中的参数通常被称为“实参”。
核心区别一个是定义,一个是调用时期的
public class Cmower {
public static void main(String[] args) { //args 形参
System.out.println("hello world");// "hello world" 实参
}
}
基本类型值传递
public class Cmower {
public static void main(String[] args) {
Cmower cmower = new Cmower();
int age = 18;
cmower.sop(age);
System.out.println("main 中的 age " + age);
}
public void sop(int age) {
age = 28;
System.out.println("sop 中的 age " + age);
}
}
//out============
sop 中的 age 28
main 中的 age 18
引用类型的值传递
public class Cmower {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Cmower cmower = new Cmower();
cmower.setName("沉默王二");
cmower.sop(cmower);
System.out.println("main 中的 cmower " + cmower.getName());
}
public void sop(Cmower cmower) {
cmower.setName("沉默王三");
System.out.println("sop 中的 cmower " + cmower.getName());
}
}
//out ————————————————
sop 中的 cmower 沉默王三
main 中的 cmower 沉默王三
Java 的确是值传递的。只不过,引用类型在调用有参方法的时候,传递的是对象的引用,并不是对象本身。而对象的引用在传递的过程中并没有发生改变,虽然对象本身发生了变化。
再看
Cmower cmower = new Cmower();
cmower.setName("沉默王二");
Cmower old = cmower;
cmower.sop(cmower); //打印沉默王三
System.out.println("main 中的 cmower " + cmower.getName()); //打印沉默王三
System.out.println(old == cmower);
//out ————————————————
sop 中的 cmower 沉默王三
main 中的 cmower 沉默王三
true
内存模型图
public class ReferenceTypeDemo {
public static void main(String[] args) {
Writer a = new Writer(18);
Writer b = new Writer(18);
modify(a, b);
System.out.println(a.getAge());
System.out.println(b.getAge());
}
private static void modify(Writer a1, Writer b1) {
a1.setAge(30);
b1 = new Writer(18);
b1.setAge(30);
}
}
————————————————
30
18
a1就是在调用一个对象引用 而b1 是两个,执行modify的时候b1和b没有关系了,因为里面b1 new了个新对象
而内存里a1和a是一个对象的引用。
Writer writer;
writer = new Writer(18);
new Writer(18),它是对象,存储于堆中 writer 此时应该叫对象引用,它存储在栈中,保存了对象在堆中的地址
https://blog.csdn.net/qing_gee/article/details/103486068
https://www.cnblogs.com/programb/p/13021304.html
https://blog.csdn.net/qing_gee/article/details/105650149