java笔记5,内存解析

实例1

//定义类:出生日期
class BirthDate{
	//类的属性
	private	int	day;
	private	int	month;
	private	int	year;
	
	//构造方法:BirthDate
	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 text();	//局部变量test存入栈内存,new出来的test对象在堆内存分配内存。
		int date = 9;	//局部变量 date(是基本数据类型,所以在栈内存分配四个字节,名为date,内容是9)
		BirthDate d1 = new BirthDate(7,7,1970);	//栈内存中d1,d2。堆内存的对象分别指向1970.1.1,。2000.1.1。
		BirthDate d2 = new BirthDate(1,1,2000);
		test.change1(date);
		test.change2(d1);
		test.change3(d2);
		system.out.prinln("date="+date);
		d1.display();	//打印出d1和d2的值
		d2.display();
	}

	public void change1(int i){
		i = 1234;	//调用change1方法时要在栈内存中给形参分配一空间,i的值为实参所传的值9。执行完change1方法后i=1234,而date的值不变。且执行完change1之后,i消失,date不变。
	}
	
	public void change2(BirthDate b){	//因为使用方法中所传的值为d1,所以方法开始之前,栈内存中的b和d1指向堆内存中的同一对象。
		b = new BirthDate(22,2,2004);	//在堆内存中新构建一个为2004.2.22.的对象,但是在方法执行完之后所分配的内存被清除。
	}
	
	public void change3(BirthDate b){
		b.setDay(22);		//会将d2中的第1天转换为第22天,因为这里面对的对象是d2,而不是新构建了一个对象。
	}
}	//方法通过对象调用,针对不同的对象调用的方法的作用域不同。

栈内存,堆内存

1:局部变量在栈内存空间。
2:栈内存中的局部变量指向堆内存中new出来的东西。
3:形式参数等同于局部变量。
4:方法执行完毕后,栈内存为这个方法分配的内存空间全部消失,堆内存所分配的空间被java垃圾收集器清理。
5:地址相同,可以找到同样的对象。

实例2

定义一个点类用来表示三维空间的点要求如下
1:可以生成具有特定坐标的点对象。
2:提供可以设置三个坐标的方法。
3:提供可以计算该点距离远点距离平方的方法。
4:编写程序验证上述三条。

class	point{
	double x , y , z;

	point( double_x,double_y , double_z){
	x = _x;
	y = _y;
	z = _z;
	} 
	void setX(double _x){
		x = _x;
	}
	
		void setX(double _x){
		x = _x;
	}
	
		void setX(double _x){
		x = _x;
	}

	double	getDistance(Point p){
		return(x-p.x)*(x-p.x)+(y-p.y)(y-p.y)+(z-p.z)(z-p.z);	//返回值在栈内存中分配了一个空间,方法返回以后,这个空间不存在,即打印之后,分配的内存消失
	}
}	
	
public	class	TsetPoint{
	public	static	void	main(String[] args){
		Point p = new Point(1.0,2.0,3.0);	//堆内存里分配栈内存中P所指向的部分的内存,执行Point方法时,首先在栈内存中分配三个内存,分别为_x,_y,_z,之后,将栈内存中这三个变量的值分别传给堆内存中的x,y,z。之后局部变量_x,_y,_z消失。
		Point p1 = new Point(0.0,0.0,0.0);
		System.out.println(p.getDistance(p1));	//栈内存中为这条语句中的p分配一个内存,但它与前边的那个p不相同,并且这里的p与p1在栈内存中的地址相同,指向同一个对象。

	p.setX(5.0);
	system.out.println(p.getDistance(new	Point(1.0,1.0,1.0)));	//从里向外,第一部分:堆内存为(1.0,1.0,1.0,)分配空间,无名字,未在栈内存中分配空间。第二部分,栈内存中分配的P指向了第一部分的(~)。
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43505709/article/details/84346676