目录
什么是方法?
方法method,就相当于其他语言中的函数function;就是解决问题/完成某个功能的一段代码。
为什么会需要方法?
- 如果方法都设计在main方法中,会使代码杂乱,执行也会变得很麻烦;
- 使用变量时也很容易产生冲突,而且由于代码自上而下执行的特性;
- 当我们需要一个重复功能的时候,就需要重复写功能,会使逻辑变得混乱
方法带来的好处
- 每个代码片段都是独立的,可以单独执行
- 每个方法中的变量互不影响
- 方法定义完之后可以重复使用
方法的基本格式
以主方法(main方法)为例:
public static void main(String[] args) {
System.out.println("这是main方法");
}
- public和static部分是方法的修饰符;
- void部分是方法返回值类型,方法的返回值类型可以是任何有效的数据类型,包括原始数据类型(如int、double等)、引用数据类型(如String、数组、自定义类等)、枚举类型和void类型。需要注意的是,方法的返回值类型必须与方法声明中的返回值类型相匹配。返回值的类型可以是基本类型,也可以是引用类型。选择返回值类型时,根据方法的逻辑和需求选择合适的数据类型。
- main部分是方法名,起名规范一般遵循小驼峰命名,小驼峰命名是一种命名约定,即其中除了第一个字母外,每个单词的首字母都大写;
- ()内是方法的参数列表,也就是在调用参数时需要传入的数据,类型可以是任何有效的数据类型,可以根据需求选择适合的类型,参数数量可以是多个,多个参数之间用逗号隔开;
- {}内是代码块,也就是这个方法执行时,要运行的代码部分,可以实现功能,如果有返回值,需要在{}最后加上return,用来返回数据。
解析代码:
public boolean userLogin(int id,String password) {
boolean b = false;
System.out.println("这里可以编写代码用来实现代码的功能!");
b = true;
return b;
}
以上代码的public是方法的修饰符,boolean代表该方法返回的是boolean类型的数据,userLogin是方法名,遵循小驼峰命名法,int和String代表需要传入的参数类型,id和password代表接收参数的变量名,方便在代码块内调用,{}是代码实现功能的部分,最后的return用来将boolean类型的b返回给调用方法的部分。
要注意的是:
- 每个方法都是独立的,定义时方法是平级,不能嵌套
- 所有方法都需要在main方法中调用才能执行,被执行的方法也可以调用其他代码
- 方法在类中的位置无所谓,上下都行
方法的分类
1:无参无返回值的方法
即返回值为void且方法名后括号内为空的方法,如下:
public void method (){
System.out.println("这是一个无参无返回值的方法");
}
无参无返回值的方法一般都用来执行固定功能,用处较为单一;
2:无参有返回值的方法
即返回值不为void且方法名后括号内为空的方法,如下:
public String method (){
System.out.println("这是一个无参有返回值的方法");
return "返回值类型是String类型";
}
无参有返回值的方法一般都用来获取固定返回值,例如:返回一个日期和固定字符串拼接的String类型的值;
3:有参无返回值的方法
即返回值为void且方法名后括号内不为空的方法,如下:
public void method (int i){
System.out.println("这是一个有参无返回值的方法,参数为:" + i);
}
有参无返回值的方法一般根据不同的参数实现不同的功能,或者根据不同的参数调用不同的方法;
4:有参有返回值的方法
即返回值不为void且方法名后括号内也不为空的方法,如下:
public String method (String str){
System.out.println("这是一个有参有返回值的方法");
return str;
}
有参有返回值的方法能够进行的操作,实现的功能较多,也是使用量较多的方法。
方法的调用
1:普通调用
方法和方法之间可以互相调用,调用格式为:
- 数据类型 变量 = 方法名([参数]);(有返回值定义变量接收,参数有就写,没有就不写)
- 方法名([参数]);(无返回值,参数有就写,没有就不写)
如果被调用的方法存在返回值,可以设置与返回值同类型的变量来接收返回值,要注意的是,返回值是谁调用就返回给谁:
public static void main(String[] args) {
m1();
}
public static void m1 (){
System.out.println("方法m1执行");
int i = m2();
System.out.println("i = " + i);
}
public static int m2 (){
System.out.println("方法m2执行");
return m3();
}
public static int m3 (){
System.out.println("方法m3执行");
return 7;
}
该代码执行结果为:
方法m1执行
方法m2执行
方法m3执行
i = 7
如上代码,执行顺序为:
- main调用m1
- m1执行打印语句
- m1调用m2
- m2执行打印语句
- m2调用m3获取返回值
- m3执行打印语句
- m3返回int类型的7
- m3执行结束
- m2接收到7返回给m1
- m2执行结束
- m1中变量i接收7
- m1输出i = 7
- m1执行结束
- main执行结束
2:递归调用
递归调用就是方法自己调用自己,直到达成某个条件会跳出调用:
public static void main(String[] args) {
int jc = jc(4);
System.out.println("jc = " + jc);
}
/**
* 递归求阶乘
* 4! = 4 * 3 * 2 * 1
*/
public static int jc(int n){
if (n == 1){
return 1;
}
return n * jc(n-1);
}
以上代码就是比较典型的递归调用,用来求阶乘,要注意的是,递归调用使用需要谨慎,如果出现无法停止的问题,请手动停止代码的运行,否则容易造成堆栈内存溢出。如果非必要,尽量少用递归调用。
拓展
1:驼峰命名法
我们通常将驼峰命名分为小驼峰命名(camelCase)和大驼峰命名(PascalCase),大小驼峰命名(CamelCase)是一种命名约定:
- 在小驼峰命名中,其中除了第一个字母外,每个单词的首字母都大写。小驼峰命名通常用于变量和方法的命名。
- 在大驼峰命名中,每个单词的首字母都大写。大驼峰命名通常用于类和接口的命名。
遵循大小驼峰命名约定可以使你的代码更易读、更清晰,并符合Java编码规范。在编写代码时,见名知意也会使代码的可阅读性大大提高。
2:return
关于return,有两个作用
- 用来返回值,在有返回值的方法中,return必须有,而且return后必须跟返回值
- 在没有返回值的方法中,return可写可不写,如果存在return,便会结束当前代码
3:修饰符
在Java中,可以使用多种访问修饰符来修饰方法,这些修饰符指定了方法的可见性、行为和限制。下面是一些常见的方法修饰符:
- public:公共修饰符,表示方法可以被任何类访问。
- private:私有修饰符,表示方法只能在定义该方法的类内部访问。
- protected:受保护修饰符,表示方法可以在同一包内的其他类以及其子类中访问。
- 默认(没有修饰符):如果没有指定修饰符,方法默认具有包级私有的访问权限,即只能在同一个包中的其他类中访问。
除了上述访问修饰符之外,还有一些其他的方法修饰符,可以用于更精细地控制方法的行为和限制,例如:
- static:静态修饰符,表示该方法属于类而不是对象,可以直接通过类名调用。
- final:最终修饰符,表示该方法不能被子类重写。
- synchronized:同步修饰符,用于多线程编程,表示该方法在同一时间只能被一个线程执行。
- abstract:抽象修饰符,表示该方法没有实现,需要在子类中进行实现。
- native:本地修饰符,表示该方法使用非Java代码实现,通常用于与本地系统或库进行交互。
小结
合理的使用方法可以提高代码的重用性、可读性、可维护性和可靠性,使程序更结构化和模块化,提高开发效率和代码的性能优化。