何谓方法?
方法的定义及使用
方法重载
命令行传参
可变参数
递归
作业
1.何谓方法?
-
Java方法是语句的集合,它们在一起执行一个功能,比如 System.out.println() 专门打印输出的
-
-
方法包含于类或对象中
-
方法在程序中被创建,在其他地方被引用
-
-
设计方法的原则:方法的本质计算实现某个功能的语句的集合。设计的时候保持方法的原子性。
即一个方法只完成一个功能,有利于后期的扩展
-
注意方法的命名规则
2.方法的定义及调用
-
方法的定义
-
修饰符:告诉编译器任何调用该方法,定义了该方法的访问类型。可选
-
返回值类型:returnValueType 是方法的返回值类型。没有返回值的方法 returnValueType 关键字是void
-
方法名:是方法的名称,用于被调用
-
参数类型:调用方法时,传递的时实参;定义方法时,设置形式参数作占位符。可选
-
方法体:定义该方法的功能
修饰符 返回值类型 方法名(参数类型 参数名){
方法体;
...;
return 返回值;
}
//例子
public static double sumCdt(double a,double b){
return a*a+b*b;
}
-
-
方法调用
-
调用方法:对象名.方法名(实参列表)
-
Java支持两种调用方法的方式,根据方法是否有返回值来选择
-
方法有返回值时,调用方法
// 定义于返回值同类型的变量 result 用于接收返回值,returnValueType result = 方法名(实参);
// 例子
int num = add(30,40);
String str_1 = printSort("hello,world");
int[] array_1 = sort(array); -
没有返回值,调用方法
//没有返回值,不需要定义变量去接受,直接执行方法即可, 方法名(实参);
// 例子
System.out.println("hello,world!");
-
-
值传递 和 引用传递
-
值传递:Java 是 值传递
-
引用传递
-
3.方法重载
-
定义:方法重载就是在一个类中,有相同的方法名称,但形参不同的方法
-
方法重载的规则
-
方法名必须相同,且形参一定不同(个数不同,或类型不同,或参数排列顺序不同等
-
方法的返回类型可以相同也可以不同
-
仅仅返回类型不同不是方法的重载
-
-
方法重载实现的原理
方法名称相同时,编译器会根据调用方法的实参个数,实参类型等去逐个匹配,来选择使用对应的方法,如果匹配失败就会报错。
4.命令行传参
有时候我们会希望运行一个程序的时候再传递给它信息。这要靠传递命令行参数给main()方法实现
比如 在 cmd 中输入 java -version ,就会输出java的版本信息
我们自己写一个类似的例子,这要靠传递命令行参数给main()方法实现
1. 写一个实现在 cmd 中简单打印一下输入参数的内容的功能
-
在cmd中进入文件对应路径后,先编译好 java 文件,在执行文件的时候报错。
为什么?因为在该路径下找不到主类
-
进入主类所在路径后,在执行文件,此时需要从主类依次向下调用
-
接着输入参数,执行函数,就实现了 在cmd 命令行中传参的简单打印功能。
5.可变参数
-
JDK 1.5 开始,Java支持传递同类型的可变参数的方法
-
在方法声明中,在指定形式参数后面加一个省略号(...)
-
一个方法智能指定一个可变参数,并且它必须是方法的最后一个参数。任何普通参数必须在它的前面声明。
//例子
package MethodArray.MtehodStudy;
public class MethodTest_3 {
public static void main(String[] args) {
// 可变参数输入,相当于数组
printMax(123,32,4,3,41,45.2);
}
public static void printMax(double... numbers){
// 等价于数组的使用方法
if (numbers.length==0){
System.out.println("你没有任何输入");
}
double result = numbers[0];
// 取最大值
for (double number : numbers) {
if (number > result) {
result = number;
}
}
System.out.println("这组数据的最大值是:"+result);
}
}
6.递归
-
定义:A方法调用B方法,叫引用,A方法调用A方法,叫递归
-
意义:递归可以用简单的程序来解决一下复杂的问题。它通常把一个大型问题层层转化为小问题来求解。递归的能力在于用少量的语句定义对象的无限集合。
-
递归结构包含两个部分:
-
递归头:什么时候将不调用自身。如果没有递归头,程序将陷入死循环。
-
递归体:什么时候需要调用自身方法。
-
-
问题:利用递归求10的阶乘
package MethodArray.MtehodStudy;
public class MethodTest_4 {
public static void main(String[] args) {
int result = fun(10);
System.out.println(result);
}
public static int fun(int n){
if(n==1){
return n;
}else {
return n*fun(n-1);
}
}
} -
注意:由于Java使用的是栈机制的(相当于一个瓶子,最底层是main方法,没调用一个方法就在上面压一层,因此不能无限压)
-
调用递归会带来大量的函数调用,运用递归需注意基数问题,调用过多会因为电脑内存不够而导致程序崩溃。
-
调用次数少才使用递归,重要的是我们要学习递归的思想,递归是解决复杂问题的一种思路
-
7.作业
-
写一个计算器,要求实现加减乘除功能,并且能循环接收新的数据,通过用户交互实现。
package MethodArray.MtehodStudy;
import java.util.Scanner;
// 该计算器可以一直进行计算,通过输入 非数字 来结束输入并打印最终结果。
// 如果运算符那里的输入不合要求,还可以重新输入运算符,进行运算
public class CalcProject_2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double result = 0; // 用于存储最后的结果
int sure = 0; // 判断语句是否进入switch 语句选择
double temp = 0; // 用于存储每一轮临时值
double num1;
System.out.println("请输入数字:");
if(scan.hasNextDouble()){
num1 = scan.nextDouble();
System.out.println("请输入+ - * /");
while (scan.hasNext()){
String str = scan.next();
System.out.println("请输入数字:");
if(scan.hasNextDouble()){
double num2 = scan.nextDouble();
switch (str){
case "+":
temp = add(num1,num2);
sure = 1;
num1 = temp;
break;
case "-":
temp = sub(num1,num2);
sure = 1;
num1 = temp;
break;
case "*":
temp = cdt(num1,num2);
sure = 1;
num1 = temp;
break;
case "/":
temp = div(num1,num2);
sure = 1;
num1 = temp;
break;
default:
System.out.println("您输入的运算符不合法");
break;
}
if(sure==0){
System.out.println("此时的结果为:"+num1);
}else {
System.out.println("此时的结果为:"+temp);
}
System.out.println("请输入+ - * /");
}else {
if(sure==0){
result = num1;
}else {
result = temp;
}
break;
}
}
System.out.println("最终的结果为:"+result);
scan.