代码示例:
public class Test { // 常量 public static final String MAN_SEX_TYPE = "man"; // 静态变量 public static String WOMAN_SEX_TYPE = "woman"; public static void main(String[] args) { People people = new People(); people.setName("张三"); people.setSex(MAN_SEX_TYPE); people.setAge(18); Test test = new Test(); // 调用静态方法 toString(people); // 调用非静态方法 test.sport(people); } /** * 静态方法 * @param people */ public static void toString(People peo) { System.out.println(String.format("name:%s, age:%s, sex:%s", peo.name, peo.age, peo.sex)); } /** * 非静态方法 * @param people */ public void sport(People peo) { System.out.println(String.format("%s正在运动", peo.name)); } @Data class People { private String name; private int age; private String sex; }}
- JVM向操作系统申请内存,根据内存大小找到具体的内存分配表,然后把内存段的起始地址和终止地址分配给JVM,
- JVM获得内存空间后,根据JVM的参数配置设置堆、栈、方法区的内存大小
- Class文件进行加载、验证、准备(为类的静态变量分配内存,初始化为系统的初始值)以及解析
- 调用类的方法(编译器会在java文件编译成class文件时收集所有类的初始化代码,包括惊天变量赋值,静态代码块,静态方法等)
- 执行方法(启动main线程,执行main方法,People people = new People()会在堆内存中创建一个People对象,对象引用people存放在栈中)。
- Test test = new Test()创建Test对象,调用静态方法toString,toString方法属于Test类,是从静态方法中获取的,放入栈中,通过栈中的peopel引用调用堆中的People对象。
- 再调用sport非静态方法,sprot方法是对象Test的方法, sprot方法进行入栈,并通过栈中的peopel引用调用堆中的People对象;