类属性的内存分布图
- 栈:一般存放基本数据类型(局部变量)
- 堆:存放对象,如数组、类等
- 方法区:常量池(常量,比如字符串),类加载信息
如下列例子:
public class Test {
public static void main(String[] args){
// (1)首先会在内存中的方法区加载 Person 类信息(类信息只会加载一次)
// (2)然后在堆内存中开辟一个新的内存空间,进行默认初始化(如 String 类型的属性赋值为null,int 类型赋值为 0)
// (3)将新开辟的内存地址赋值给 p1,此时 p1 指向 Person 对象
Person p1 = new Person();
// (4)进行指定初始化,如以下代码:p1.name = "jack"; p1.age = 10;
p1.name = "jack";
p1.age = 10;
// p1 是一个引用类型,将 p1 的地址赋值给 p2,此时 p2 也指向 Person 对象
Person p2 = p1;
System.out.println(p2.age); // 10
}
}
class Person {
String name;
int age;
}
内存分布图:
类方法的调用机制
- 当程序执行到方法时,就会在栈中开辟一个独立的内存空间
- 当方法执行完毕或执行到return语句时,就会返回
- 返回到调用方法的地方
- 返回后,继续执行方法后面的代码
- 当main方法执行完毕,整个程序退出
如以下例子:
public class Test {
public static void main(String[] args){
Person p = new Person();
// 调用方法
int result = p.getSum(10, 20);
System.out.println(result); // 30
}
}
class Person {
String name;
int age;
public int getSum(int num1, int num2){
int sum = num1 + num2;
return sum;
}
}
方法调用机制如下图: