“java只有值传递,没有引用传递”
public class TestDemo7 {
public static void main(String[] args){
People p1=new People("小明",22);
System.out.println("之前:"+p1);
change(p1);
System.out.println("之后:"+p1);
}
public static void change(People temp){
temp.setName("小红");
temp.setAge(20);
}
}
class People{
private String name;
private int age;
public People(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
People开辟了一个指向0x00堆内存的栈内存,在堆内存中0x00=小明,22,所以打印的结果是: 之前:People{name=‘小明’, age=22};,当传递之后,change会复制同一个栈内存0x00,指向同一个堆内存,改变内容0x00=小红,20,当change出栈后,堆内存已被改变,所以打印内容也改变 :之后:People{name=‘小红’, age=20}
public class TestDemo7 {
public static void main(String[] args){
People p1=new People("小明",22);
System.out.println("之前:"+p1);
change(p1);
System.out.println("之后:"+p1);
}
public static void change(People temp){
temp=new People("小红",20);
}
}
class People{
private String name;
private int age;
public People(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
在程序中,p1指向0x00,而在传递之后,由于出现了new关键字, temp=new People(“小红”,20);开辟了新的栈内存0x01,而0x01代表的堆内存保存的是小红,20,在change中打印的话是该结果,而
change(p1);
System.out.println(“之后:”+p1);
打印的依然是p1,结果依然是
之前:People{name=‘小明’, age=22}
之后:People{name=‘小明’, age=22}
总结:当使用基本数据类型,不可变类型时,值不会改变。使用new关键字时,地址改变,值不会改变。通过set方法,基本都会改变。