public class Student {
private int age;//年龄
private String name;//姓名
private List courses = new ArrayList();//科目
private int[] luckies;//幸运数字
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int age, String name, List courses, int[] luckies) {
super();
this.age = age;
this.name = name;
this.courses = courses;
this.luckies = luckies;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List getCourses() {
return courses;
}
public void setCourses(List courses) {
this.courses = courses;
}
public int[] getLuckies() {
return luckies;
}
public void setLuckies(int[] luckies) {
this.luckies = luckies;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + ", courses=" + courses + ", nums="
+ Arrays.toString(luckies) + "]";
}
}
package test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author Administrator
*
*/
/**
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
List courses = new ArrayList();
courses.add("语文");
int[] luckies = {3,6,8};
Student stu = new Student(15, "张三", courses, luckies);
System.out.println(stu+"\n");
System.out.println("----年龄加10岁----");
addAge(stu.getAge());
System.out.println(stu+"\n");
System.out.println("----改名字----");
changeName(stu.getName(), "张改名");
System.out.println(stu+"\n");
System.out.println("----增加科目----");
addCourse(stu.getCourses(), "英语");
System.out.println(stu+"\n");
System.out.println("----所有幸运数字加1----");
addLuckyNu(stu.getLuckies());
System.out.println(stu+"\n");
System.out.println("----改变学生的属性----");
changeStuAttribute(stu);
System.out.println(stu+"\n");
System.out.println("----换个学生----");
changeStudent(stu);
System.out.println(stu+"\n");
}
/**
* 年龄增加10岁
* @param age
*/
private static int addAge(int age) {
System.out.println("增加年龄前age:"+age);
age+=10;
System.out.println("增加年龄后age:"+age);
return age;
}
/**
* 增加科目
* @param courses
* @param courseName
*/
private static List addCourse(List courses,String courseName) {
for(int i=0;i
System.out.println("增加科目前科目"+i+":"+courses.get(i));
}
courses.add(courseName);
for(int i=0;i
System.out.println("增加科目后科目"+i+":"+courses.get(i));
}
return courses;
}
/**
* 改名字
* @param name
* @param name1
* @return
*/
private static String changeName(String name,String name1) {
System.out.println("改名前name:"+name);
name = name1;
System.out.println("改名后name:"+name);
return name;
}
/**
* 所有幸运数字加1
* @param luckies
* @return
*/
private static int[] addLuckyNu(int[] luckies) {
for(int i=0;i
System.out.println("增加幸运数字前幸运数字"+i+":"+luckies[i]);
luckies[i]++;
}
for(int i=0;i
System.out.println("增加幸运数字后幸运数字"+i+":"+luckies[i]);
}
return luckies;
}
/**
* 改变学生的属性
* @param s
*/
private static void changeStuAttribute(Student s) {
s.setAge(addAge(s.getAge()));
s.setCourses(addCourse(s.getCourses(), "社会"));
System.out.println(s);
}
/**
* 换个学生
* @param s
*/
private static void changeStudent(Student s) {
s = new Student();
s.setAge(20);
s.setName("张换人");
s.getCourses().add("体育");
int[] nums = {1,2};
s.setLuckies(nums);
System.out.println(s);
}
}
结果:
Student [age=15, name=张三, courses=[语文], nums=[3, 6, 8]]
----年龄加10岁----
增加年龄前age:15
增加年龄后age:25
Student [age=15, name=张三, courses=[语文], nums=[3, 6, 8]]
----改名字----
改名前name:张三
改名后name:张改名
Student [age=15, name=张三, courses=[语文], nums=[3, 6, 8]]
----增加科目----
增加科目前科目0:语文
增加科目后科目0:语文
增加科目后科目1:英语
Student [age=15, name=张三, courses=[语文, 英语], nums=[3, 6, 8]]
----所有幸运数字加1----
增加幸运数字前幸运数字0:3
增加幸运数字前幸运数字1:6
增加幸运数字前幸运数字2:8
增加幸运数字后幸运数字0:4
增加幸运数字后幸运数字1:7
增加幸运数字后幸运数字2:9
Student [age=15, name=张三, courses=[语文, 英语], nums=[4, 7, 9]]
----改变学生的属性----
增加年龄前age:15
增加年龄后age:25
增加科目前科目0:语文
增加科目前科目1:英语
增加科目后科目0:语文
增加科目后科目1:英语
增加科目后科目2:社会
Student [age=25, name=张三, courses=[语文, 英语, 社会], nums=[4, 7, 9]]
Student [age=25, name=张三, courses=[语文, 英语, 社会], nums=[4, 7, 9]]
----换个学生----
Student [age=20, name=张换人, courses=[体育], nums=[1, 2]]
Student [age=25, name=张三, courses=[语文, 英语, 社会], nums=[4, 7, 9]]
内存分配:
第一步:java编译为class文件,并将方法声明到方法区中
第二步:执行该程序 为main分配栈帧 new ArrayList()对象,数组对象luckies,int型,String,new Student()对象
第三步:执行addAge方法,未addAge方法分配栈帧
addAge方法执行完后栈帧销毁,感觉未做任何操作
第四步:执行changeName方法,为changeName分配栈帧
changeName方法执行完后栈帧销毁,感觉未做任何操作
第五步:执行addCourse方法,为addCourse方法分配栈帧
addCourse方法执行完后栈帧销毁,由于数组是引用类型,对象时存在堆中的,传参时只是把course的地址传给了changeName方法,而在changeName中对数组进行操作是在堆中进行的操作,故退出方法后course的地址不变,值改变
第六步:执行addLuckyNu方法,为addLuckyNu分配栈帧
changeName方法执行完后栈帧销毁,同步骤五,退出方法后luckies的地址不变,值改变
第七步:执行changeStuAttribute方法,为changeStuAttribute方法分配栈帧
changeStuAttribute方法执行完后栈帧销毁,同步骤五,退出方法后stu的地址不变,值改变,对应的course属性的地址不变,只改变
第八步:执行changeStudent方法,为changeStudent方法分配栈帧
changeStuAttribute方法执行完后栈帧销毁,同步骤五,退出方法后stu的地址不变,值改变,对应的course属性的地址不变,只改变
对于运行时常量是当该常量不被引用时由GC回收,但是并不一定及时
以上是个人对java虚拟机内存的分配,请大神指教