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); //0
System.out.println(u1.username); //null
System.out.println(u1.password); //null
u1.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); // 0
System.out.println(u.username); // null
System.out.println(u.addr); // null
u.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);
}
}