- Java方法
- 1. 什么是方法?
- 2. 方法的定义和调用
- 方法的定义
- 方法的调用
- 注意
- 3. 方法的重载
- 4. 命令行传递参数
- 5. 可变参数
- 6. 递归
- 7. 练习
- 8. 总结
1. 什么是方法?
Java方法是语句的集合,它们在一起执行一个功能。
- 方法是解决一类问题的步骤的有序组合。
- 方法包含类与对象中。
- 方法在程序中被创建,在其他地方被引用。
设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成一个功能,这样有利于我们后期的扩展。
- 方法的命名规则:首字母小写和驼峰规则。
2. 方法的定义和调用 方法的定义
Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
-
修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
-
返回值类型:方法可能会有返回值。returnValueType 是方法返回值的数据类型。有些方法执行执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字 void。
-
方法名:方法的实际名称。方法名和参数表共同构成方法签名。
-
参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
- 形参:在方法被调用时用于接收外界输入的数据。
- 实参:调用方法时实际传给方法的数据。
-
方法体:方法体包含具体的语句,定义该方法的功能。
-
语法为:
修饰符 返回值类型 方法名(参数类型 参数名){ ··· 方法体 ··· return 返回值; }注意:
- 参数可以有多个。
- return 0; 可以直接终止方法。
-
定义一个加法算法,在主函数中调用该方法,实例代码如下:
public class Demo{ public static void main(String[] args){ int sum = add(223,114); //定义一个int型变量 System.out.println(sum); //输出和 } //定义一个方法,实现加法运算 public static int add(int x,int y){ int sum = x + y; //将参数x和y相加 return sum; //返回值 } }运行结果为:
方法的调用
Java 支持两种调用方法的方式,根据方法是否具有返回值来进行选择。
语法:
对象名.方法名(实参列表);
-
当方法返回一个值的时候,关键字就是返回值的数据类型。方法调用通常被当做一个值。例如:
int large = max(30,40);
-
如果方法没有返回值,关键字为 void(空),方法调用一定是一条语句。
System.out.println("Hello,World");
Java 是值传递,它是通过把值一层层传递下去,一步一步进行运算,最终得出结果。
3. 方法的重载
方法的重载就是一个类中,有相同的函数名称,但形参不同的函数。
方法的重载的规则:
- 方法名称必须相同。
- 参数列表必须不同(参数个数不同、参数数据类型不同、参数的排列顺序不同等)。
- 方法的返回类型可以相同,也可以不同。
- 仅仅返回类型不同不足以成为方法的重载。
实现理论:方法名称相同时,编译器会根据调用方法的参数个数、参数类型、参数排列顺序等去逐个匹配,已选择对应的方法,如果匹配失败,则编译器报错。
-
根据不同数据类型的值,运用加法运算,算出结果,代码如下:
public class Demo{ public static void main(String[] args){ int sum = add(223,114); //定义一个int型变量 double sum2 = add(11.3,13.8); //定义一个double型变量 System.out.println(sum); //输出和 System.out.println(sum2); } //定义一个方法,实现整数相加 public static int add(int x,int y){ int sum = x + y; return sum; } //定义一个方法,实现小数相加 public static double add(double x,double y){ double sum = x + y; return sum; } }运行结果为:
方法名虽然相同,但调用的方法不同,一个是整数,一个是小数。程序中,只要 add() 方法中括号里的参数是怎样的,它就会调用对应的方法。
4. 命令行传递参数
有时候你希望运行一个程序时候再传递给它消息,这要靠传递命令行参数给 main() 函数实现。
public class Demo{
public static void main(String[] args){
for(int i = 0;i < argslength;i++){
System.out.println("args["+ i +"]" + args[i]);
}
}
}
main() 方法中有参数,参数类型是数组。
- 使用命令行运行 Java 程序,步骤如下:
-
找到 Java 文件的地址,右键点击选中的 Java文件 ,选择“Open in”,点击进入“Explorer”。
-
从地址栏中打开DOS命令窗口,在地址前面输入cmd + 空格,回车进入DOS窗口,输入javac java类的名称.java,编译后生成.class文件。
-
运行 class 文件。由于不能直接在class文件所处位置运行,只能在 src 下执行,所以要跳转到上层。在DOS命令窗口输入“cd…/”,回到上一层,重复输入,直到回至 src,然后输入java 包的全路径.Demo01。
-
因为本身 main() 中就包含参数(字符串数组),我们可以传递给它一些参数,让它输出。我们在上面的基础上,在后面加上一段字符串,然后回车输出。
5. 可变参数
JDK 1.5 开始,Java 支持传递同类型的可变参数给一个方法。
-
在方法声明中,在指定参数类型后加一个省略号(…)。
-
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
-
例如:
public class Demo{ public static void main(String[] args){ //调用可变参数的方法 printMax(32,12,53,6,34,86.7); printMax(new double[]{1,4,5,6,7}); //传递一个double型数组 } public static void printMax(double... numbers){ //不定项参数 //判断是否有参数传入 if(numbers.length == 0){ System.out.println("No argument passed"); //如果没有参数传入,输出No argument passed return; } double result = numbers[0]; //定义一个double型的数组 //排序 for(int i = 1;i < numbers.length;i++){ if(numbers[i] > result){ //如果当前参数大于result,就把当前参数赋值给result,保证result为最大值 result = numbers[i]; } } System.out.println("The max value is" + result); //输出最大值result } }运行结果为:
-
这个可变参数本质就是数组。
6. 递归
A方法调用B方法,顾名思义,就是在A方法中调用B方法来完成一些操作。
递归就是:A方法调用A方法!就是自己调用自己,重复进行。
-
利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较少的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
-
递归结构包括两个部分:
- 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
- 递归体:什么时候需要调用自身方法。
-
利用递归的思想,算出数字阶乘的结果,实例代码如下:
public class Demo(){ public static void main(String[] args){ System.out.println(f(6)); //调用递归方法,计算6的阶乘 } //递归思想,计算阶乘方法 public static int f(int n){ if(n == 1){ //判断是否为1(边界值) return 1; }else{ return n * f(n - 1); //不为1,递归实现阶乘 } } }运行结果为:
了解递归思想,我们可以分为三个阶段:
- 边界条件:边界值(到最后一个数时,程序会进行到底,随后就会一层层返回)。
- 前阶段:当参数不为1时,不停的调用自身,直到等于边界值1,就返回结果。
- 返回阶段:n * (n - 1)
注意:
- 递归思想是栈机制的。栈就相当于一个上方开口的罐子,main() 方法就在最下面,调用其他方法就会一层层压在 main() 方法上,除了解决掉问题,或者是方法结束后才会消失。空间占用很大,时间复杂度大。对于一些比较大,比较深的问题,用递归就会显得麻烦,甚至程序会崩溃,运行不了。
- 能不用递归就不用递归,可以用其他的方法代替,但对于基数比较小的,就可以用递归,会比较方便。
- 学习递归是要了解递归的这种思想,而不是学递归就去用,对于怎样的问题,我们应该合理分析、判断,最后再考虑使用什么样的方法。
7. 练习
写一个计算器,要求实现加减乘除功能,并且能循环接收新数据,通过用户交互实现。实例代码如下:
public class Demo{
public static void main(String[] args){
//循环输入
while(true){
System.out.println("请输入第一个数字");
Scanner number1 = new Scanner(System.in); //创建一个Scanner对象
double n1 = number1.nextDouble(); //接收第一个数字
System.out.println("请输入算术符号");
Scanner operator = new Scanner(System.in);
String o = operator.next(); //接收算术符号
System.out.println("请输入第二个数字");
Scanner number2 = new Scanner(System.in);
double n2 = number1.nextDouble(); //接收第二个数字
switch(o){
case "+":
System.out.println("结果为:"+add(n1,n2)); //如果是“+”就相加
break;
case "-":
System.out.println("结果为:"+subtraction(n1,n2)); //如果是“-”就相减
break;
case "*":
System.out.println("结果为:"+multiplication(n1,n2)); //如果是“*”就相乘
break;
case "/":
System.out.println("结果为:"+division(n1,n2)); //如果是“/”就相除
break;
default:
System.out.println("Input error"); //如果不是上述符号,就输出“Input error”
break;
}
System.out.println("=========================");
}
}
//加法运算
public static double add(double x,double y){
double sum = x + y; //求和
return sum;
}
//减法运算
public static double subtraction(double x,double y){
double difference = x - y; //求差
return difference;
}
//乘法运算
public static double multiplication(double x,double y){
double product = x * y; //求积
return product;
}
//除法运算
public static double division(double x,double y){
double quotient = x / y; //求商
return quotient;
}
}
运行结果为:
通过调用不同的方法实现各种不同的运算,虽然看起来不好看,但是能够完成相应的算式。
8. 总结
Java方法就是用来解决某具体事情的,例如:四则运算、去往某地乘坐怎样的交通工具、动物的行为活动等。在 main() 主方法中调用其他方法来完成相应步骤,这样代码就不会显得冗杂。掌握方法的定义和语法、方法的承载,了解递归思想,其他认识即可。



