Java学习日记10——变量及其传递、引用类型和基本类型变量的传递区别
变量的定义在前面已经讲解过了:点击这里 可以查看原文。这里的分类会略微不通过与之前。这里的变量主要分为字段变量和局部变量。
1.在存储角度来看:
字段变量是对象的一部分,存放于堆之中,然后局部变量是存放在栈中间的。
2.在生命周期角度来看:
字段变量的生命周期是随着类的存在而存在,但是局部变量仅仅是在方法调用的时候存在。而且在方法中的局部变量是必须要初始化定义的,而不像字段变量一样可以自动分配。
3.在语法角度来看:
字段变量属于类,可以用pubic和private、static、final等修饰,局部变量不能被访问控制符和static修饰,可以被final修饰。
调用方法时——变量的传递
由于Java中变量的类型不同,所以各方法之间的参数传递效果会不一致。基本参数类型的值是直接存在变量中的,是复制性传递,也就是相同的变量名会存在于不同的内存区,调用的结果会不同,所以将这个方法的值复制到另一个方法进行改变时,当前方法的值不会改变(相当于是多个同名变量,只在自己的方法体生效)。而引用类型的数据是存放在内存空间中,其引用的实体对象(用new方法创建的)也会占据一定空间,如果在其他方法对值进行修改,会导致最终值的改变。
具体见下面的例子:其中int整数类型是基本数据类型,而数组int[ ]是引用类型的变量。
程序不麻烦,简单易懂,不要怕!
public class variable {
static void modify(int a) {
a++;
System.out.println("在modify方法中的a已经变为:"+a);
}
static void modify(int []b) {
b[0]++;
System.out.println("在modify方法中的b[0]已经变为:"+b[0]);
}
public static void main(String []args) {
int a = 0;
System.out.println("初始化的a为:"+a);
modify(a);
System.out.println("经过其他方法修改的主函数a为:"+a);
int []b = new int[1];
System.out.println("初始化的b[0]为:"+a);
modify(b);
System.out.println("经过其他方法修改的主函数b[0]为:"+b[0]);
}
}
程序的运行结果为:
初始化的a为:0
在modify方法中的a已经变为:1
经过其他方法修改的主函数a为:0
初始化的b[0]为:0
在modify方法中的b[0]已经变为:1
经过其他方法修改的主函数b[0]为:1
注意: 如果你直接将a定义在类中的话,也就是相当于将a作为variable类的一部分,也将会占用一定的内存空间,因为类是引用类型数据,这样就是相当于作为引用类型——类的一部分,也将伴随着类的实体对象产生(new)而产生相应的产生。那就可以理解为引用类型,也会随着方法体的修改而改变。
引用类型数据的传递注意事项
引用类型例如类的实体,建立(new)一个类的实体d,然后利用赋值符号赋值给另一个实体对象dd,如果只是单纯的利用赋值符号传递,那么最终的效果是d和dd实际操作的是同一个对象内存空间。也就是说,不经过new的赋值,只是将d的引用传递给dd,并不会生成新的实体对象。
举一个例子:
package learning4;
public class dataconvert {
private int year;
private int mouth;
private int day;
void yearadd() {
year ++;
}
void setdata(int year,int mouth,int day){
this.day = day;
this.mouth = mouth;
this.year = year;
}
void dispaly() {
System.out.println(year+"年"+mouth+"月"+day+"日");
}
public static void main(String [] args) {
dataconvert d = new dataconvert();
dataconvert dd = d;//让dd直接等于d,这样的操作其实并没有重新分配内存
//dd和d操作的都是同一个内存数据
d.setdata(2020, 8,1);//用d进行赋值
dd.setdata(2019, 11, 11);//用dd进行赋值,由于实际操作的都是一个内存,所以最终结果会以2019.11.11为最终赋值参数
d.dispaly();
d.yearadd();
d.dispaly();
dd.dispaly();
}
}
程序的执行结果如下:
2019年11月11日
2020年11月11日
2020年11月11日
通过观察运行的结果,可以看出,只要不是用new分配的空间,就不算建立新的对象,像这样直接用等号的,即使设置再多个对象,也操作的是同一个对象空间。
如果你对Java有兴趣,可以了解一下前面几期的基础知识!下面附上链接:
Java编程基础认知:Java学习日记1——基础认知
Java面向对象编程认识:Java学习日记2——面向对象编程认知
Java程序的基本结构认识:Java学习日记3——程序类型与构成认知
Java的输入输出方法总结:Java学习日记4——Java输入输出方法总结
Java的数据类型、变量、常量、运算符:Java学习日记5——数据类型、变量、常量、运算符、数组
Java学习日记6——类、字段、方法、this的使用:Java学习日记6——类、字段、方法、this的使用
Java学习日记7——类的继承、super使用规则:Java学习日记7——类的继承、super使用规则
Java学习日记8——public、static、private、final、abstract、protected修饰符:Java学习日记8——public、static、private、final、abstract、protected修饰符
Java学习日记9——接口(长文预警):Java学习日记9——接口(长文预警)