Java学习日记10——Java中的变量及其传递

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();
	}
}

程序的执行结果如下:

201911112020111120201111

通过观察运行的结果,可以看出,只要不是用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——接口(长文预警)

猜你喜欢

转载自blog.csdn.net/weixin_44005494/article/details/107710587
今日推荐