方法的定义与使用
本系列内容为阿里云大学 java学习路线里的内容
阿里云大学 java学习路线传送门.
八、方法的定义与使用
在程序之中很多情况下是可能需要重复执行一些代码的。在有一些书上也会把方法(method)称为函数(function)。需要主要一点,本次进行方法定义的时候有一个前提:方法在主类中定义,并且由主方法直接调用。
8.1、方法的定义
基本定义方式
本次方法是定义在主类之中并且由主方法直接调用的,所以方法的定义语法如下:
public static 返回值类型 方法名称([参数类型 变量,....]) {
// 该方法要执行的代码
[return [返回值] ;]
}
对于返回值而言就可以使用Java中定义的数据类型了(基本数据类型、引用数据类型),在方法之中可以进行返回数据的处理,如果要返回数据则可以使用return来描述,return所返回的数据类型与方法的返回值类型相同,如果不返回数据,则该方法可以使用void进行声明。
关于方法名与变量的定义命名要求:
- 方法名和变量名命名规则一致
- 在进行方法名称定义的时候要求第一个单词的字母小写,而后每个单词的首字母大写。
- 在进行变量名称定义的时候要求第一个单词的字母小写,而后每个单词的首字母大写。
- 一个方法基本不会太长
定义一个无参无返回值的方法
public class test {
public static void main(String args[]) {
printMessage(); // 执行方法调用
printMessage(); // 执行方法调用
}
public static void printMessage(){ // 该方法包含了三行代码
System.out.println("***************");
System.out.println("*** test ***");
System.out.println("***************");
}
}
Output:
***************
*** test ***
***************
***************
*** test ***
***************
方法本质,就是方便使用者调用,程序都是从主方法开始往下执行的。
定义一个有参数有返回值的方法
public class test {
public static void main(String [] args){
String result = get(20.0) ;
System.out.println(result) ;
System.out.println(get(1.0)) ; //返回值可以直接输出
}
public static String get(double money){
if(money >= 10.0){
return "一份快餐,找零:" + (money - 10.0);
}else{
return "对不起,余额不足。请先充值!";
}
}
}
Output:
一份快餐,找零:10.0
对不起,余额不足。请先充值!
在进行方法定义的时候,如果方法的返回值类型为void,那么可以利用return来结束调用。
利用return结束方法调用
public class test {
public static void main(String args[]) {
get(3);
System.out.println("------------");
get(0);
System.out.println("************");
get(2);
}
public static void get(int count){
if(count <= 0) return;
for (int x = 1; x <= count; x++){
System.out.println("给我点了:" + x +"赞!");
}
}
}
Output:
给我点了:1赞!
给我点了:2赞!
给我点了:3赞!
------------
************
给我点了:1赞!
给我点了:2赞!
如果从定义的语法来讲方法并不是一个难以理解的概念,就是一段可以被重复调用的代码而已,但是良好的方法设计是需要根据实际的开发经验慢慢累计的,但是请千万记住一点:在Java定义方法的时候一般都不要太长。
8.2、方法重载
方法重载的定义
当方法名称相同,参数的类型或个数不同的时候就称为方法重载。
定义一个加法处理的方法
那么下面先通过个程序来做一个简单的分析,现在要定义一个加法处理的方法,该方法可以接收两个int变量、三个int变量、三个double变量的加法处理。
public class test {
public static void main(String [] args){
System.out.println("加法执行结果:"+sum(1,2)); //调用两个int参数的方法
System.out.println("加法执行结果:"+sum(10,20,30)); //调用三个int参数的方法
System.out.println("加法执行结果:"+sum(11.1,22.2,33.3));
}
public static int sum(int x,int y){
return x + y;
}
public static int sum(int x,int y,int z){
return x + y + z;
}
public static double sum(double x,double y,double z){
return x + y + z;
}
}
Output:
加法执行结果:3
加法执行结果:60
加法执行结果:66.6
根据传参和返回自动选择方法体,实现方法重载
- 方法重载与方法返回类型没有关系
- 但实际开发中,只要时方法重载,强烈建议其返回值类型相同
观察一个程序代码
public class test {
public static void main(String [] args){
System.out.println(1);
System.out.println(1.1);
System.out.println(true);
System.out.println('A');
System.out.println("Hello World");
}
}
Output:
1
1.1
true
A
Hello World
现在可以发现,所有的输出操作支持有各种数据类型,所以System.out.println()本身就属于一个方法重载。
8.3、方法递归调用
方法的递归调用指的是一个方法自己调用自己的情况,利用递归调用可以解决一些重复且麻烦的问题。在进行方法递归调用的时候一般需要考虑如下几点问题:
- 一定要设置方法递归调用的结束条件;
- 每一次调用的过程之中一定要修改传递的参数条件。
实现一个1~100的累加
递归方式:
public class test {
public static void main(String [] args){
System.out.println(sum(100));
}
public static int sum(int num){
if(num == 1){
return 1;
}
return num + sum(num - 1);
}
}
Output:
5050
传统方式:
public class test {
public static void main(String [] args){
int sum = 0;
int x = 1;
while(x<=100){
sum += x;
x++;
}
System.out.println(sum);
}
}
Output:
5050
代码分析处理:
· 【第1次执行sum(),主方法执行】return 100 + sum(99);
· 【第2次执行sum(),sum()递归调用】return 99 + sum(98);
· … … … … … …
· 【第99次执行sum(),sum()递归调用】return 2 + sum(1);
· 【第100次执行sum(),sum()递归调用】return 1;
整体形式:
return 100 + 99 + 98 + … … … + 2 + 1;递归操作虽然可以简化的调用,但是在实际开发之中,编写的代码可能会很少出现有递归情况。大部分情况下考虑的都只是一些简单的处理逻辑。递归少去使用还有另外一个原因:如果处理不当则会造成内存有溢出。
计算“1!+2!+3!+4!+5!+… … +90!”
在进行阶乘计算的时候必须要考虑选择的数据类型,肯定不能够使用int或long,只能够使用double。
public class test {
public static void main(String [] args){
System.out.println(sum(90));
System.out.println(fan(90));
}
public static double sum(int num){
if(num == 1)
return 1;
return fan(num) + sum(num - 1);
}
public static double fan(int num){ // 执行累加
if(num == 1){ // 执行累加
return 1;
}
return num * fan(num - 1); // 递归调用
}
}
Output:
1.502411534554385E138
1.4857159644817607E138
实际上有一部分的递归都是可以通过循环来完成,但是如果使用递归要比使用循环结构看起来更加清晰一些。