定义方法
方法的定义由方法名称、参数、返回值类型及方法体组成。
方法头指方法的修饰符、返回值类型、方法名和方法的参数。方法可以返回一个值,也可以不返回值。
定义在方法头中的变量称为形式参数,当调用方法的时候,就给参数传递一个值,这个值称为实际参数。方法名和参数列表一起构成方法签名,参数是可选的。
- 定义:指被定义的条目是什么
- 声明:为被声明的条目分配内存来存储数据
调用方法
方法的调用是执行方法中的代码。
main方法是由Java虚拟机调用的,方法头永远都是一样的。包括修饰符 public 和 static,String[]类型的参数。
每当调用一个方法时,系统会创建一个活动记录,用于保存方法中的参数和变量。活动记录置于一个内存区域中,称为调用堆栈。
当一个方法调用另一个方法时,调用者的活动记录保持不动,一个新的活动记录被创建用于被调用的新方法,一个方法结束返回到调用者时,其相应的活动记录也被释放。
void方法不需要return语句,但可以用于终止方法并返回到方法的调用者。
通过传值进行参数传递
调用的方法的时候是通过传值的方式将实参传给形参的。调用方法时,必须达到参数顺序匹配。实参必须与方法签名中定义的参数在次序和数量上匹配,在类型上兼容,在类型上兼容指不需要经过显式的类型转换。
在调用带参数的方法时,实参的值传递给形参,这个过程称为按值传递。
❗️一个需要注意的例子
public static void swap(int n1,int n2){
System.out.println("\tInside the swap method");
System.out.println("\t\tBefore swapping, n1 is "+n1+" n2 is "+n2);
int temp = n1;
n1 = n2;
n2 = temp;
System.out.println("\t\tAfter swapping, n1 is "+n1+" n2 is "+n2);
}
假设传入实参参数为 num1 和 num2。
最后的结果如下,可以看到实参的值没有被改变。
原因是n1和n2有自己独立于num1和num2的存储空间。所以n1和n2的改变不影响num1和num2的内容。形参是方法中具有自己存储空间的变量,局部变量是在调用方法时分配的,当方法返回到调用者的时候就消失了。
那么如何完成两个数的交换呢?首先需要明白JAVA中有两种数据类型,一种是基本数据类型,一种是引用数据,而JAVA中的参数传递机制是值传递,具体如下:
- 形参是基本数据类型的,将实参的值传递给形参的基本数据类型的变量
- 形参是引用数据类型的,将实参的引用类型变量的值(对象的首地址)传递给形参
基本数据类型:简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数。
引用数据类型:Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。
Java数据类型在内存中的存储:
- 基本数据类型的存储原理:所有的简单数据类型不存在“引用”的概念,基本数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面,而Java语言里面八种数据类型是这种存储模型;
- 引用类型的存储原理:引用类型继承于Object类(也是引用类型)都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”是存储在有序的内存栈上的,而对象本身的值的存储在内存堆上的
重载方法
方法重载是指在一个类中有两个方法,它们具有相同的名字,但有不同的参数列表。编译器根据方法签名决定使用哪个方法。不能基于不同修饰符或返回值类型来重载方法。
变量的作用域
在方法中定义的变量是局部变量,局部变量必须在使用之前进行声明和赋值。不能在嵌套块中或同一块中两次声明同一个局部变量。
方法抽象和逐步求精
方法抽象是通过将方法的使用和它的实现分离来实现的。