大家好,我是你的好朋友思创斯。今天说一说java改变引用数据类型的值_8种基本数据类型,希望您对编程的造诣更进一步.
在java中,引用数据类型的数据传递的是值(地址)的拷贝
对于以下代码
class birthdate {
private int day;
private int month;
private int year;
public birthdate(int d, int m, int y) {
day = d;
month = m;
year = y;
}
public void setday(int d) {
day = d;
}
public void setmonth(int m) {
month = m;
}
public void setyear(int y) {
year = y;
}
public int getday() {
return day;
}
public int getmonth() {
return month;
}
public int getyear() {
return year;
}
public void display() {
system.out.println
(day " - " month " - " year);
}
}
public class test {
public static void main(string args[]){
test test = new test();
int date = 9;
birthdate d1= new birthdate(7,7,1970);
birthdate d2= new birthdate(1,1,2000);
test.change1(date);
test.change2(d1);
test.change3(d2);
system.out.println("date=" date);
d1.display();
d2.display();
}
public void change1(int i){
i = 1234;
}
public void change2(birthdate b) {
b = new birthdate(22,2,2004);
}
public void change3(birthdate b) {
b.setday(22);
}
}
希望我今天分享的这篇文章可以帮到您。
上述是一个对生日对象进行初始化,并进行修改的程序。程序通过构造函数进行初始化,并尝试使用不同方法对对象存储的值进行修改。
birthdate是一个引用数据类型,简单地用方法传递值不能改变对象存储的值,应该使用类birthdate的特定方法setday。
图解引用数据类型的值传递和内存变化
局部变量存储在栈内存中,对象的值存储在堆内存中,故进行初始化后,内存中的分布会呈现如下图
此时栈内存中存储了对象test、d1、d2的地址以及局部变量date的值,而堆内存中存储了d1的值和d2的值,由栈内存中d1和d2的地址指向堆内存中各自的值。
而当执行了下面程序段后
test.change1(date);
/*
省略中间的代码
*/
public void change1(int i){
/*
尚未执行的代码
*/
}
此时内存如下图所示
在方法change1中,程序段在栈内存中为形式参数i分配了新的空间,并通过值传递将其赋值为date的值,也就是9。
当开始执行代码段
public void change1(int i){
i = 1234;
}
形式参数i的值被改为1234,而date中的值并没有改变。
当change1方法执行完毕后,为局部变量所分配的空间全部消失,而date的值依然为9,修改失败。
继续执行change2
test.change2(d1);
/*
省略中间的代码
*/
public void change2(birthdate b) {
/*
尚未执行的代码
*/
}
此时内存如下图所示
系统在栈内存中开辟新的空间给b,并将对象d2的值(地址)传递给了形式参数对象b,使得b的地址指向了一个和d2地址指向相同的堆内存空间,也就是指向对象d2存储的值。看起来就要修改成功了,不是吗?
但当执行下面代码段
public void change2(birthdate b) {
b = new birthdate(22,2,2004);
}
这时b的地址改为指向新new出来的对象,内容悄然发生改变。
当change2方法执行完毕后,为局部变量所分配的空间全部消失,存储在堆内存中的值也会在一段时间后被垃圾回收机制回收,而d2的值并没有发生变化,修改依然失败。
最后看change3代码段
test.change3(d2);
/*
省略中间的代码
*/
public void change3(birthdate b) {
/*
尚未执行的代码
*/
}
类似于change2,系统给形式参数b分配了空间,指向d2对象的值
接下来执行setday方法
public void setday(int d) {
day = d;
}
/*
省略中间的代码
*/
public void change3(birthdate b) {
b.setday(22);
}
setday是类birthdate中的方法,调用setday方法后,会将setday(int d)中的形式参数d传递给day这个成员变量,反映在内存中就是b的属性day变为22,由于b和d2在堆内存中所指向的是同一块内存空间,所以修改成功。
最后b这块内存消失,此时birthdate对象d2的值已经发生改变。
文章由思创斯整理,转载请注明出处:https://ispacesoft.com/381397.html