通过以上内容的学习,可以看出方法是一段可以完成某个特定功能的并且可以被重复利用的代码片段。接下来我们来学习一下方法应该怎么定义以及怎么调用。
定义/声明方法的语法格式如下所示:
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
例如代码:
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是返回值类型。
接下来我将列出方法的相关规则,其中一些规则目前可能需要大家死记硬背,还有一些规则希望大家在理解的前提下进行记忆:
● [修饰符列表],此项是可选项,不是必须的,目前大家统一写成public static,后面的课程会详细讲解。
● 返回值类型,此项可以是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语句构成,方法体当中的代码只能遵循自上而下的顺序依次逐行执行,不能跳行执行,核心代码在执行过程中如果需要外部提供数据,则通过形参进行获取。
整体来说方法的声明语法是很简单的,我相信每个人都能记住,其实我觉得方法的定义难度最大的不是语法,而是方法在定义的时候,返回值类型定为什么类型比较合适?方法的形式参数列表中定义几个参数合适?每个参数的数据类型定义为什么比较合适?以上的一系列问题实际上还是需要和具体的功能结合在一起才能决定,当然,这不是一天两天的事儿,不是说这一章节的内容学完之后就真正的会定义方法了,我们只能说语法会了,还需要后期不断的做项目,写代码才能找到感觉,找到编程思路。到那时,你自然就会定义返回值类型、形式参数列表了。
当一个方法声明之后,我们应该如何去让这个方法执行呢,当然,这个时候就需要亲自去调用这个方法了,调用方法的语法格式是(前提是方法的修饰符列表中带有static关键字):“类名.方法名(实际参数列表);”,例如以下代码:
public class MethodTest {
public static void main(String[] args) {
MethodTest.sumInt(100, 200);
MethodTest.sumDouble(1.0, 2.0);
}
public static void sumInt(int x , int y){
System.out.println(x + "+" + y + "=" + (x + y));
}
public static void sumDouble(double a , double b){
System.out.println(a + "+" + b + "=" + (a + b));
}
}
运行结果如下图所示:
图7-2:方法如何调用
需要注意的是,方法在调用的时候,实际传给这个方法的数据被称为实际参数列表,简称实参,java语法中有这样的规定:实参和形参必须一一对应,所谓的一一对应就是,个数要一样,数据类型要对应相同。例如:实参(100 , 200)对应的形参(int x , int y),如果不是一一对应则编译器就会报错。当然也可能会存在自动类型转换,例如:实参(100 , 200)也可以传递给这样的形参(long a , long b),这里我们先不谈这个。
实际上方法在调用的时候,有的情况下“类名.”是可以省略的,我们来看看什么情况下它可以省略不写:
public class MethodTest03 {
public static void main(String[] args) {
sumInt(100, 200); //“类名.”可以省略
sumDouble(1.0, 2.0);//“类名.”可以省略
//doOther(); //编译报错
Other.doOther(); //“类名.”不能省略
}
public static void sumInt(int x , int y){
System.out.println(x + "+" + y + "=" + (x + y));
}
public static void sumDouble(double a , double b){
System.out.println(a + "+" + b + "=" + (a + b));
}
}
public class Other{
public static void doOther(){
System.out.println("Other doOther...");
}
}
运行结果如下图所示:
图7-3:“类名.”什么时候可以省略
通过以上程序的分析,我们得知,当在a()方法执行过程中调用b()方法的时候,并且a()方法和b()方法在同一个类当中,此时“类名.”可以省略不写,但如果a()方法和b()方法不在同一个类当中,“类名.”则不能省略。