1、方法概述
方法(method)是代码的集合,它们在一起执行一个功能;方法是解决一类问题的步骤的有序组合,它定义于类中。
注意:
- 方法必须先创建才可以使用,创建的过程称为方法定义
- 方法创建后并不是直接运行的,需要手动使用后才执行,该过程称为方法调用
- 充值, 转账功能, 实际上是用户调用的, 是通过网络请求
- 我们现阶段的调用都是自己手写代码调用
- main方法不需要程序员手动调用,是由JVM调用的。但是除了main方法之外其他的方法,都需要程序员手动调用。
- 方法只有调用的时候才会执行,方法不调用是不会执行的。
- 方法定义在类体当中。方法定义的先后顺序没有关系
- 方法中的变量都属于局部变量。方法结束之后,局部变量占用的内存会自动释放。
2、方法的定义和调用
这里定义的方法要手动调用
1、把调用的方法和被调用的方法写在同一个类
2、static静态类, 方法如果带static关键字, 它调用的方法也必须要带static,如果调用方法不带static,被调用的方法可以带static,也可以不带static
方法定义
- 格式: public static void 方法名( ) {
//方法体
}
- 范例: public static void isEvenNumber() { //方法体
}
方法调用
- 格式: 方法名( ) ;
- 范例: isEvenNumber( ) ;
注意:
- 方法必须先定义后调用,否则程序将报错
3、带参数方法的定义和调用
带参数方法定义
- 格式: public static void 方法名 ( 参数 ) { … … }
- 格式(单个参数): public static void 方法名 ( 数据类型 变量名 ) { … … }
- 范例(单个参数): public static void isEvenNumber(int number) { … … }
- 格式(多个参数): public static void 方法名 ( 数据类型 变量名1 ,数据类型 变量名2 ,…… ) { … … }
- 范例(多个参数): public static void getMax(int number1,int number2) { … }
注意:
- 方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错
- 方法定义时,多个参数之间使用逗号( ,)分隔
带参数方法调用
- 格式: 方法名 ( 参数 ) ;
- 格式(单个参数): 方法名 ( 变量值/常量值 ) ;
- 范例(单个参数): isEvenNumber( 5 ) ;
- 格式(多个参数): 方法名 ( 变量值1/常量值1 ,变量值2/常量值2 ) ;
- 范例(多个参数): getMax ( 5,6 ) ;
注意:
- 方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错
形参和实参
形参:方法定义中的参数
等同于变量定义格式,例如:int number
实参:方法调用中的参数
等同于使用变量或常量,例如: 10 number
4、带返回值方法的定义和调用
带返回值方法定义
- 格式: public static 数据类型 方法名 ( 参数 ) {
return 数据 ;
}
- 范例1: public static boolean isEvenNumber(
int number ) { return true ;
}
- 范例2: public static int getMax( int a, int b) {
return 100 ;
}
注意:
方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
带返回值方法调用
- 格式1: 方法名 ( 参数 ) ;
- 范例: isEvenNumber ( 5 ) ;
- 格式2: 数据类型 变量名 = 方法名 ( 参数 ) ;
- 范例: boolean flag = isEvenNumber ( 5 );
注意:方法的返回值通常会使用变量接收,否则该返回值将无意义
5、方法的注意事项
- 方法不能嵌套定义:方法是平级关系,不能嵌套定义
- 可以嵌套调用
- void表示无返回值,可以省略return,也可以单独的书写return,后面不加数据
- 如果方法有返回值类型, 那么就一定要用return 数据类型匹配的值; 把值返回给方法的调用者, 调用者一般使用变量接收
方法的通用格式
- 格式: public static 返回值类型 方法名(参数) {
方法体;
return ;
}数据
- public static 修饰符,目前先记住这个格式
- 返回值类型 方法操作完毕之后返回的数据的数据类型如果方法操作完毕,没有数据返回,这里写void,此时return是可选的
- 方法名 调用方法时候使用的标识
- 参数 由数据类型和变量名组成,多个参数之间用逗号隔开
- 方法体 完成功能的代码块
- return 1,结束方法的执行;2,如果方法定义有返回值,用于把数据返回给调用者
- 格式: public static 返回值类型 方法名(参数) {
方法体;
return 数据 ;
}
- 定义方法时,要做到两个明确
- 明确返回值类型:主要是明确方法操作完毕之后是否有数据返回,如果没有,写void;如果有,写对应的数据类型
- 明确参数:主要是明确参数的类型和数量
- 调用方法时
- void类型的方法,直接调用即可
- 非void类型的方法,推荐用变量接收调用
6、方法重载
方法重载概述
方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载
- 多个方法在同一个类中
- 多个方法具有相同的方法名
- 多个方法的参数不相同,类型不同或者数量不同
- 跟返回值类型没有关系
方法重载特点
- 重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式
- 重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载
为什么方法的返回值类型不能用于区分重载的方法?
对于int f(){}和void f()两个方法,如果这样调用int result = f(),系统可以识别是调用返回值类型为int的方法;
但 Java调用方法时可以忽略方法返回值,如果采用如下方法来调用f(),你能判断是调用哪个方法吗?
如果你尚且不能判断,那么Java系统也会糊涂。
在编程过程中有一条重要规则:不要让系统糊涂,系统一糊涂,肯定就是你错了。
因此,Java里不能使用方法返回值类型作为区分方法重载的依据。
看下代码什么是重载:
class Test {
public static void main(String[] args) {
int a = 10;
int b = 20;
int ret = add(a, b);
System.out.println("ret = " + ret);
double a2 = 10.5;
double b2 = 20.5;
double ret2 = add(a2, b2); //改变变量类型的重载
System.out.println("ret2 = " + ret2);
double a3 = 10.5;
double b3 = 10.5;
double c3 = 20.5;
double ret3 = add(a3, b3, c3); //变量个数不同
System.out.println("ret3 = " + ret3);
}
public static int add(int x, int y) {
return x + y;
}
public static double add(double x, double y) {
return x + y;
}
public static double add(double x, double y, double z) {
return x + y + z;
}
}
public static double add(int x, int y) { //这样就不叫重载,满足上面俩种才叫
return x + y;
}
7、方法的参数传递
Java中方法的参数传递只有一种方式:值传递
将实际参数值的副本(复制品)传入方法中,而参数本身不受影响。所谓形参就是方法声明定义的时候的参数,实参就是方法调用时实际传递给形参的参数。介绍之前先简单了解下Java内存模型
8、方法递归
递归概述:以编程的角度来看,递归指的是方法定义中调用方法本身的现象
递归解决问题的思路:
把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
递归解决问题要找到两个内容:
- 递归出口:否则会出现内存溢出
- 递归规则:与原问题相似的规模较小的问题
列题:
斐波那契数列(Fibonacci sequence),又称黄金分割数列、兔子数列,是数学家列昂纳多·斐波那契于1202年提出的数列。斐波那契数列为1、1、2、3、5、8、13、21、34……此数列从第3项开始,每一项都等于前两项之和,递推公式为F(n)=F(n-1)+F(n-2),n≥3,F(1)=1,F(2)=1。
import org.junit.Test;
import java.util.Arrays;
import java.util.Scanner;
public class homework05 {
public static int suanfa(int n){
if (n <= 0){
return 0;
}
if (n == 1 || n == 2){
return 1;
}
return suanfa(n - 1) + suanfa(n - 2);
}
@Test
public void Test4(){
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个数:");
int n = sc.nextInt();
System.out.println(n);
System.out.println("根据斐波那契数列规律来看");
int a = suanfa(n);
System.out.println("第"+n+"位数是"+a);
}}
按顺序打印一个数字的每一位
class SequencePrint{
public void sequenceprint(int x){
if(x>9){
sequenceprint(x/10);}
System.out.println(x%10);}}