java中主要的三块内存空间:
1.栈内存(stack):在方法别调用时,栈内存会给方法分配内存(压栈),主
要存储的是局部变量。方法调用结束后,该方法所占用的内存释放(弹栈)。
栈内存具有先进后出,后进先出的特点。
2.堆内存:存储对象。
3.方法区:类加载器classload,将硬盘上的.class字节码文件加载到JVM方法
区当中,存储的主要是代码片段。
下面是代码运行的内存图:
Student类:
public class Student{// 属性(描述状态),在java程序中以“成员变量”的形式存在。// 学号// 一个对象一份。int no; // 这种成员变量又被称为“实例变量”。// 姓名String name;// 年龄int age;// 性别boolean sex;// 住址String addr;}
StudentTest类:
public class StudentTest{public static void main(String[] args){// s1属于局部变量吗?当然是。// s1这个局部变量叫做引用Student s1 = new Student();// s2也是局部变量。// s2也叫做引用。Student s2 = new Student();s1.no = 110;s1.name = "张三";s1.age = 20;s1.sex = true;s1.addr = "深圳宝安区";System.out.println("学号=" + s1.no);System.out.println("姓名=" + s1.name);System.out.println("年龄=" + s1.age);System.out.println("性别=" + s1.sex);System.out.println("住址=" + s1.addr);// 再次赋值s1.addr = "北京大兴区";System.out.println("住址:" + s1.addr);}}
User类:
public class User{// 类=属性+方法// 用户id// int是一种基本数据类型int id; // 实例变量// 用户名// String是一种引用数据类型String username; // 实例变量String password;
}
UserTest类:
public class UserTest{// 方法体外声明的变量叫做成员变量。//User u1; //成员变量。(实例变量)public static void main(String[] args){//int i = 100;// 方法体当中声明的变量叫做局部变量User u1 = new User();// 实例变量怎么访问(属性怎么访问)?// 语法是:“引用.属性名”System.out.println(u1.id); //0System.out.println(u1.username); //nullSystem.out.println(u1.password); //nullu1.id = 11111;u1.username = "zhangsan";u1.password = "123";System.out.println(u1.id);System.out.println(u1.username);System.out.println(u1.password);User u2 = new User();u2.id = 22222;u2.username = "lisi";u2.password = "456";System.out.println(u2.id);System.out.println(u2.username);System.out.println(u2.password);}
}
Address类:
public class Address{// 一个家庭住址有3个属性。// 城市String city; // 实例变量// 街道String street;// 邮编String zipcode;
}
User类:
public class User{// 类=属性+方法// 以下3个都是属性,都是实例变量。(对象变量。)// 用户id// int是一种基本数据类型int id; // 实例变量// 用户名// String是一种引用数据类型String username; // 实例变量// 家庭住址// Address是一种引用数据类型// addr是成员变量并且还是一个实例变量// addr是一个引用。Address addr;
}
Test类:
public class Test{public static void main(String[] args){// 家庭住址对象Address a = new Address();a.city = "北京";a.street = "大兴区";a.zipcode = "121221";// 用户对象User u = new User();System.out.println(u.id); // 0System.out.println(u.username); // nullSystem.out.println(u.addr); // nullu.id = 11111;u.username = "zhangsan";u.addr = a;System.out.println(u.username + "是"+u.addr.city+"城市的!");// u.addr.city 这行代码可拆分,u.addr.city 节省变量。// 拆分成以下代码和以上效果完全相同,原理完全相同,不同的是以下代码多了两个变量。Address ad = u.addr;String zhuZhi = ad.city;System.out.println(zhuZhi);}
}