下面我们要用代码解释数据在堆和栈的的存放情况。
1要点对象在堆中存储。
2对象引用在栈中存储。
package Com.king.practise;
public class Student {
private String name="zhang san";
private int age=10;
private int id=1000000;
Student(){
}
Student(String name,int age,int id){
this.name=name;
this.age=age;
this.id=id;
}
public Student copyStudent(Student s){
return new Student(s.getName(),s.getAge(),s.getId());
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public int getId(){
return id;
}
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public void setId(int id){
this.id=id;
}
}
package Com.king.practise;
public class People {
public static void main(String[] args) {
String name="Jone";
int age=22,newAge=23;
int id=133384;
Student s1=new Student(name,age,id);
s1.setAge(newAge);
s1.setName("Jone White");
Student s2=s1;
System.out.println("Studnet1");
System.out.println(s1.getId()+s1.getName()+s1.getAge());
s1.setAge(29);
System.out.println("Studnet2");
System.out.println(s2.getId()+s2.getName()+s2.getAge());
System.out.println("Studnet1");
System.out.println(s1.getId()+s1.getName()+s1.getAge());
}
}
结果是这样:
Studnet1
133384Jone White23
Studnet2
133384Jone White29
Studnet1
133384Jone White29
如何理解结果,我们明明是改的是对象s1的属性,为什么s2的属性也发生了改变。
其实关键是正确的理解Student s2=s1;
首先s2,s1这俩个变量是即堆区对象的引用(指针),也就是存放的是对象的地址。
Studnet s2=s1 的意思是创建一个和s1指向同一个对象的引用(地址),换句话说s2和s1的
地址值是相同的,他们都指向堆中的同一个对象,并不是在堆中新建了一个对象。
牢记只用用new关键字才可在堆中新建一个对象,那么如何才能让俩个
public class People {
public static void main(String[] args) {
String name="Jone";
int age=22,newAge=23;
int id=133384;
Student s1=new Student(name,age,id);
s1.setAge(newAge);
s1.setName("Jone White");
Student s2=new Student();
System.out.println("Student2");
System.out.println(s2.getId()+s2.getName()+s2.getAge());
s2=s1;
System.out.println("Student1");
System.out.println(s1.getId()+s1.getName()+s1.getAge());
System.out.println("Student2");
System.out.println(s2.getId()+s2.getName()+s2.getAge());
s1.setName("new name");
System.out.println("Student1");
System.out.println(s1.getId()+s1.getName()+s1.getAge());
System.out.println("Student2");
System.out.println(s2.getId()+s2.getName()+s2.getAge());
}
}
Student2
1000000zhang san10
Student1
133384Jone White23
Student2
133384Jone White23
Student1
133384new name23
Student2
133384new name23
这样虽然用了俩个new但是s2=s1;和上面的效果是一样的,都是指向同一个对象,只不过
s2以前指向的对象没有指针指向了。
那么如何创俩个真正的克隆一个对象呢?我的意思是真正的在堆中创造俩个属性一样的对象。
可以调用调用copyStudent()方法。
package Com.king.practise;
public class People {
public static void main(String[] args) {
String name="Jone";
int age=22,newAge=23;
int id=133384;
Student s1=new Student(name,age,id);
s1.setAge(newAge);
s1.setName("Jone White");
Student s2=s1.copyStudent(s1);
System.out.println("Student2");
System.out.println(s2.getId()+s2.getName()+s2.getAge());
s2.copyStudent(s1);
System.out.println();
System.out.println("Student1");
System.out.println(s1.getId()+s1.getName()+s1.getAge());
System.out.println("Student2");
System.out.println(s2.getId()+s2.getName()+s2.getAge());
s1.setName("new name");
System.out.println("Student1");
System.out.println(s1.getId()+s1.getName()+s1.getAge());
System.out.println("Student2");
System.out.println(s2.getId()+s2.getName()+s2.getAge());
}
}
结果:
Student2
133384Jone White23
Student1
133384Jone White23
Student2
133384Jone White23
Student1
133384new name23
Student2
133384Jone White23
这样才真真的创造了属性相同的不同对象。
本人菜鸟,如有错误希望大家指正。