java只分配了1g的内存_java 内存分配小结

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值