在编程中我们在解决一类事情时可能有一些需要重复的代码,就是在多处都会用到的代码.如果都打出来就会大大增加我们的工作量,这个时候我们可以把这些代码封装起来,然后起个名字,这在java中就叫方法.
1.方法的定义
方法的定义的语法格式为:
[修饰符] 返回值类型 方法名([参数类型 参数名]){//[]--->可有可无
...
方法体
...
return 返回值;
}
修饰符:访问权限修饰符,默认为public static
返回值类型:经过方法的计算后得到的结果的类型,可以为基本数据类型或引用数据类型,当没有返回值时为void
方法名:方法的名字,方法名就是一个标识符,所以应该遵守标识符的命名规则和规范,即方法名的首字母小写,之后的每个单词的首字母大写.并且要见名知意.
参数:参数列表是指方法的参数类型、顺序和参数的个数,参数列表中可以存在多个参数,每个参数之间用逗号','隔开
方法体:解决功能的代码块
return:有两种功能,一个是提前结束方法,一个是带出返回值
方法签名:方法名与参数列表共同组成方法签名,方法签名确保了在类中的唯一性
例:
public static void main(String []args){
System.out.println("Hello world");
}
其中方法可以分为有返回值的跟无返回值的,无返回值的可以没有return,有返回值的必须有return.
形式参数(形参):定义方法时()中的参数 :局部变量的声明
实际参数(实参):调用方法时()中的参数 :局部变量的赋值
2.方法的调用
一个方法定义之后,只有通过调用才能发挥作用.在调用时,调用的控制权有方法调用处转移到方法中,方法遇到return或者}时,将调用权还给调用处.也就是从哪里来回哪里去.
在调用的时候形参跟实参的数据类型跟顺序应该一致.
方法中的数据类型大小比较:
实参<=形参
接收返回值的数据类型>=方法的返回值类型>=返回值的数据类型
其中方法的调用方式大致分为三类:
-
直接调用:有返回值的方法不推荐使用,因为返回值获取不到
方法名(实参);
例:
public class Demo {
public static void main(String[] args){
getPI();
}
public static void getPI(){
System.out.println("3.1415926");
}
}
-
赋值调用:
接收数据类型 变量名=方法名(参数);
例:
public class Demo {
public static void main(String[] args){
double pi=getPI();
}
public static void getPI(){
return 3.1415926 ;
}
}
-
输出调用:
System.out.println(方法名(参数));
例:
public class Demo {
public static void main(String[] args){
System.out.println(getPI());
}
public static void getPI(){
return 3.1415926 ;
}
}
3.方法的重载
假设我们定义了一个"吃"方法,每次调用时传入实参"饭",在"吃"中我们写了吃饭的方式.但是有时候"饭"有很多种,每种的"饭"需要不同的吃法,但是一个"吃"中只能写一种吃法,所以这个时候我们就需要写几个不同的"吃",虽然都名为吃,但是却根据饭的不同,我们有不同的吃法.这个多写几个"吃"的方式就是方法的重载.
重载是一个类里面,方法名字相同,但是参数列表不同,返回类型可以相同也可以不同,每个重载的方法都有独一无二的参数列表.
其中重载的规则如下:
-
被重载的方法必须改变参数列表(参数个数或类型不一样);
-
被重载的方法可以改变返回类型;
-
被重载的方法可以改变访问修饰符;
-
被重载的方法可以声明新的或更广的检查异常;
-
方法能够在同一个类中或者在一个子类中被重载;
-
无法以返回值类型作为重载函数的区分标准.
例:
public class Overloading {
public int test(){
System.out.println("这是无参的方法test");
return 1;
}
public void test(int a){
System.out.println("这是有参的方法test");
}
//以下两个参数类型顺序不同
public String test(int a,String s){
System.out.println(s);
return a;
}
public String test(String s,int a){
System.out.println(s);
return a;
}
public static void main(String[] args){
Overloading ove = new Overloading();
System.out.println(ove.test());
ove.test(1);
System.out.println(ove.test(1,"test3"));
System.out.println(ove.test("test4",1));
}
}
4.方法的递归调用
方法的递归调用就是方法就是自己调用自己.
在使用递归时,我们需要注意的是:
递归方法必须要有明确的结束条件
尽量少使用递归
例:求斐波那契数列
public class RecursionDemo {
public static int fb(int num) {
if (num == 1 || num == 2) {
return 1;
} else {
return fb(num - 2) + fb(num - 1);
}
}
public static void main(String[] args) {
for (int i = 1; i < 10; i++) {
System.out.print(fb(i) + "\t");
}
}
}