1 方法定义
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
例如代码:
public static void sumInt(int a , int b){
int c = a + b;
System.out.println(a + "+" + b + "=" + c);
}
public static是修饰符列表;
void是返回值类型;
sumInt是方法名;
(int a , int b)是形式参数列表,简称形参,每一个形参都是局部变量;
形参后面使用一对儿大括号括起来的是方法体,方法体是完成功能的核心代码,方法体中的代码有执行顺序的要求,遵循自上而下的顺序依次逐行执行,不存在跳行执行的情况。
再如代码:
public static int sumInt(int a , int b){
int c = a + b;
return c;
}
以上程序中sumInt之前的int是返回值类型。
- [修饰符列表],此项是可选项,不是必须的。
- 返回值类型,此项可以是Java语言当中任何一种数据类型,包括基本数据类型,也包括所有的引用数据类型,当然,如果一个方法执行结束之后不准备返回任何数据,则返回值类型必须写void。返回值类型例如:byte,short,int,long,float,double,boolean,char,String,void等。
- 方法名,此项需要是合法的标识符,开发规范中要求方法名首字母小写,后面每个单词首字母大写,遵循驼峰命名方式,见名知意,例如:login、getUsername、findAllUser等。
- 形式参数列表(int a, int b),此项又被称为形参,其实每一个形参都是“局部变量”,形参的个数为0~N个,如果是多个参数,则采用半角“,”进行分隔,形参中起决定性作用的是参数的数据类型,参数名就是变量名,变量名是可以修改的,也就是说(int a , int b)也可以写成(int x , int y)。
- 方法体,由一对儿大括号括起来,在形参的后面,这个大括号当中的是实现功能的核心代码,方法体由Java语句构成,方法体当中的代码只能遵循自上而下的顺序依次逐行执行,不能跳行执行,核心代码在执行过程中如果需要外部提供数据,则通过形参进行获取。
2 方法调用
调用方法的语法格式是(前提是方法的修饰符列表中带有static关键字):“类名.方法名(实际参数列表);”,例如以下代码:
/**
* @author wcs
* @date 2021/8/4 17:43
*/
public class MethodTest01 {
public static void main(String[] args) {
MethodTest01.sumInt(12, 23);
MethodTest01.sumDouble(23.3, 34.45);
}
public static void sumInt(int x, int y) {
System.out.println(x + y);
}
public static void sumDouble(double a, double b) {
System.out.println(a + b);
}
}
运行结果:

需要注意的是:
- 方法在调用的时候,实际传给这个方法的数据被称为实际参数列表,简称实参,Java语法中有这样的规定:实参和形参必须一一对应,所谓的一一对应就是,个数要一样,数据类型要对应相同。
- 当在a()方法执行过程中调用b()方法的时候,并且a()方法和b()方法在同一个类当中,此时“类名.”可以省略不写,但如果a()方法和b()方法不在同一个类当中,“类名.”则不能省略。
3 方法重载
不用方法重载:
/**
* @author wcs
* @date 2021/8/4 18:27
*/
public class MethodTest02 {
public static void main(String[] args) {
int x = sumInt(12, 34);
long y = sumLong(3L, 4L);
System.out.println(x);
System.out.println(y);
}
public static int sumInt(int a, int b) {
return a + b;
}
public static long sumLong(long a, long b) {
return a + b;
}
}
缺点:两个方法功能不同,但相似。程序员需要记住更多的方法名。
使用方法重载后:
/**
* @author wcs
* @date 2021/8/4 18:37
*/
public class MethodTest03 {
public static void main(String[] args) {
int x = sum(12, 34);
long y = sum(3L, 4L);
System.out.println(x);
System.out.println(y);
}
public static int sum(int a, int b) {
return a + b;
}
public static long sum(long a, long b) {
return a + b;
}
}
在Java语言中,是怎么进行方法的区分的呢?
首先Java编译器会通过方法名进行区分。
但是在Java语言中允许方法名相同的情况出现。
如果方法名相同的情况下,编译器会通过方法的参数类型进行方法的区分。
3.1 什么时候使用方法重载
在同一个类当中,如果“功能1”和“功能2”它们的功能是相似的,那么可以考虑方法重载。
条件1:在同一个类当中
条件2:方法名相同
条件3:参数列表不同
参数个数不同算不同、参数的类型不同算不同、参数的顺序不同算不同。
同时满足以上3个条件,那么可以认定方法和方法之间发生了重载机制。
/**
* @author wcs
* @date 2021/8/4 18:54
*/
public class MethodTest04 {
public static void main(String[] args) {
m1(2);
m1(23, 34);
m2(2, 3.4);
m2(45.3, 22);
m3("张三");
m3(33F);
}
//参数个数不同
public static void m1(int a) {
System.out.println("hello");
}
public static void m1(int b, int c) {
System.out.println("world");
}
//参数顺序不同
public static void m2(int a, double b) {
System.out.println("int a,double b");
}
public static void m2(double b, int a) {
System.out.println("double b,int a");
}
//c参数类型不同
public static void m3(String name) {
System.out.println(name);
}
public static void m3(float f) {
System.out.println(f);
}
}
运行结果:

方法重载和返回值类型以及修饰符列表无关。
4 递归方法
方法自身调用自身就是方法递归。
/**
* @author wcs
* @date 2021/8/4 19:17
*/
public class MethodTest05 {
public static void main(String[] args) {
dosome();
}
public static void dosome() {
System.out.println("开始执行");
dosome();
//永远不会执行到。
System.out.println("执行完毕");
}
}
以上便是递归算法,一直调用自身,直到内存占满。所以递归一定要有结束条件。(假设条件是对的,递归有的时候也会出现栈内存溢出错误,因为有可能递归的太深,栈内存不够了,还没执行到结束条件就已经压栈压满了。)