一、方法调用机制
1、方法调用机制详细介绍
下面对方法调用在内存中的情况进行分析,以下面的代码为例:
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.name = "张三";
person.age = 18;
int res = person.calcSum(1,2);
}
}
class Person {
String name;
int age;
//求两个数字的和的方法
public int calcSum(int num1,int num2) {
return (num1 + num2);
}
}
在执行语句
Person person = new Person();
时,会在堆区创建一个对象,然后在 main 函数的栈帧中会创建一个对象引用变量,这个引用变量中存储的引用就是刚才创建的对象的引用。
然后执行下面这两句代码,
person.name = "张三";
person.age = 18;
对对象的属性初始化。
然后执行下面的代码,
int res = person.calcSum(1,2);
这里在调用对象 person 的方法时,会再开辟一个栈帧,就是 calSum 的栈帧,
方法内的局部变量和方法的参数在被调用时存储在方法的栈帧中。
这里的参数是基本数据类型,所以传参进行的是值拷贝,将实际参数的值直接拷贝给在 calSum 栈帧中的形式参数变量,然后进行计算,最后返回值,在方法返回后,它的栈帧就会被销毁,将返回值赋给变量 res。
这里我们发现在调用一个方法时会开辟方法对应的栈帧,再这个方法返回时,它的栈帧就会被销毁。
最后当程序退出时,main 函数栈帧也会被销毁。
二、方法调用细节
方法内部不能再定义方法。
1、访问修饰符
类的属性有访问修饰符,类的成员方法也有访问修饰符,与类的属性一致。
访问修饰符:
在Java中,访问修饰符(Access Modifiers)用于控制类、方法和属性(字段)的可见性。它们决定了其他类是否能够访问特定的类成员(属性或方法)。Java中有四种主要的访问修饰符:
public
protected
- (什么都不写时的访问级别为默认)
private
修饰符 当前类 同一个包 子类(不同包) 其他包 public
√ <