实例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指向了第一部分的(~)。
}
}