1、代码如下
package com.atguigu.java;
public class Test2 {
public static void main(String[] args) {
Person_test p_test = new Person_test();// 第一句解析
p_test.name = "Tom"; // 第二句解析
p_test.age = 18;// 第二句解析
p_test.sex = 1;// 第二句解析
p_test.study(); // 第三句解析,无变量变化过程
p_test.showAge();// 第三句解析,无变量变化过程
int newAge = p_test.addAge(2); //第四句解析
System.out.println(p_test.name + "的新年龄为:" + newAge); // 第五句解析
System.out.println(p_test.age); //20,第六句解析
}
}
class Person_test{
String name;
int age;
/*sex:1表明是男性
sex: 0表明是女性*/
int sex;
public void study(){
System.out.println("studying");
}
public void showAge(){
System.out.println(age);
}
public int addAge(int i){
age += i;
return age;
}
}
2、存储的说明
属性与变量的不同点与相同点
注意:局部变量/形参 存储在栈;属性存储在堆
3、
3.1 Person_test p_test = new Person_test();# 第一句解析
1⃣️左边:在栈空间声明了一个p_test对象,指向了堆空间;
2⃣️右边:堆空间根据Person_test{}中,由于没有赋值,所以创建了的三个属性均是默认值;
String name; -- 默认值为 null
int age; -- 默认值为 0
int sex; -- 默认值为 0
图示例:
3.2 p_test.name = "Tom"; // 第二句解析
p_test.age = 18;// 第二句解析
p_test.sex = 1;// 第二句解析
通过p_test调用 name/age/sex这些属性,堆空间赋值后结果为
name 为 "Tom"; // 第二句解析
age 为 18;// 第二句解析
sex 为 1;// 第二句解析
图示例:
3.3 p_test.study(); // 第三句解析,无变量变化过程
p_test.showAge();// 第三句解析,无变量变化过程
3.4 int newAge = p_test.addAge(3); //第四句解析
右边:p_test.addAge(3);是调用了addAge(3)方法,addAge()方法为
public int addAge(int i){
age += i;
return age;
}addAge函数中,i是形参,形参就是局部变量,所以存储在栈中;并i=2
return的age是p_test对象的,所以将i(即是2)累加到堆空间的age上,故age=20
return age;则是将age即20返回
方法结束后,i也就用完了,i出栈
左边:int newAge中newAge的是方法里面定义的变量,所以是局部变量,故存在栈中
图示例:
System.out.println(p_test.name + "的新年龄为:" + newAge); // 第五句解析
System.out.println(p_test.age); //20,第六句解析
System.out.println(p_test.name + "的新年龄为:" + newAge); // 第五句解析
输出的内容是栈空间的20(在栈空间)System.out.println(p_test.age); //20,第六句解析
输出的内容是栈空间指到堆空间的内容,20(在堆空间)
图示例:
注: