码迷,mamicode.com
首页 > 编程语言 > 详细

java 内存分配小结

时间:2015-11-07 06:43:38      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:对象   引用   内存分配   

下面我们要用代码解释数据在堆和栈的的存放情况。

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

这样才真真的创造了属性相同的不同对象。

本人菜鸟,如有错误希望大家指正。

本文出自 “最好的风景” 博客,转载请与作者联系!

java 内存分配小结

标签:对象   引用   内存分配   

原文地址:http://runrun.blog.51cto.com/9754749/1710481

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!