java內存分配

public class Student {java

private int age;//年齡
private String name;//姓名
private List<String> courses = new ArrayList<String>();//科目
private int[] luckies;//幸運數字

public Student() {
super();
// TODO Auto-generated constructor stub
}

public Student(int age, String name, List<String> 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<String> getCourses() {
return courses;
}
public void setCourses(List<String> courses) {
this.courses = courses;
}
public int[] getLuckies() {
return luckies;
}數組

public void setLuckies(int[] luckies) {
this.luckies = luckies;
}ide

@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + ", courses=" + courses + ", nums="
+ Arrays.toString(luckies) + "]";
}

}this

 

package test;對象

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;blog

/**
* @author Administrator
*
*/
/**
* @author Administrator
*
*/
public class Test {內存

public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> courses = new ArrayList<String>();
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<String> addCourse(List<String> courses,String courseName) {
for(int i=0;i<courses.size();i++) {
System.out.println("增長科目前科目"+i+":"+courses.get(i));
}
courses.add(courseName);
for(int i=0;i<courses.size();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<luckies.length;i++) {
System.out.println("增長幸運數字前幸運數字"+i+":"+luckies[i]);
luckies[i]++;
}
for(int i=0;i<luckies.length;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);
}
}get

 

結果:同步

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<String>()對象,數組對象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虛擬機內存的分配,請大神指教

相關文章
相關標籤/搜索