概念:就是一种封装,使代码结果变得清晰,容易复用。
经验:将需要在多个位置重复使用的一组代码,定义在方法内部。
细节:方法实现不调用不执行
方法与方法之间是平级的,哪怕是main方法跟普通方法也是平级的。
定义以及调用语法:
//定义
public void 方法名称(形式参数){
//方法主体
}
//调用
方法名称(实际参数);
未使用方法前的弊端:
问题:每次循环打印繁琐,且冗余多
public class NoArg1 {
public static void main(String[] args) {
System.out.println("床前明月光");
for(int i=1;i<=10;i++) {
System.out.print("*");
}
System.out.println(); //回车
System.out.println("疑是地上霜");
for(int i=1;i<=10;i++) {
System.out.print("*");
}
System.out.println(); //回车
System.out.println("举头望明月");
for(int i=1;i<=10;i++) {
System.out.print("*");
}
System.out.println(); //回车
System.out.println("低头思故乡");
for(int i=1;i<=10;i++) {
System.out.print("*");
}
System.out.println(); //回车
}
}
解决方案:将循环的冗余代码,抽取出去,使用时,通过标记调用
1、无参数无返回值方法
方法的实现语法结构:
void: 无返回值类型
public static void 方法名(){
方法体
}
方法调用的语法结构:
方法名();
public class NoArg2 {
public static void main(String[] args) {
System.out.println("床前明月光");
print(); //方法调用
System.out.println("疑是地上霜");
print(); //方法调用
System.out.println("举头望明月");
print(); //方法调用
System.out.println("低头思故乡");
print(); //方法调用
}
//方法实现(方法定义)
public static void print(){
for(int i=1;i<=10;i++) {
System.out.print("*");
}
System.out.println(); //回车
}
}
2、有参数无返回值方法
方法实现语法结构:
public static void 方法名(参数1, 参数..){
}
方法调用: 方法名(实参1, 实参..)
传参,把变动的东西抽取出去,从外面传入---提升复用性
debug调试:1.加断点 2.debug as..运行 f6: 单步执行 f8:跳到下一个断点,如果没有下一个,则结束 f5:进入方法内部
传单个参数:
public class HaveArg1 {
public static void main(String[] args) {
System.out.println("床前明月光");
print(10); //方法调用--实参
System.out.println("疑是地上霜");
print(12); //方法调用
}
//方法实现(方法定义)
public static void print(int n){ //形参
for(int i=1;i<=n;i++) {
System.out.print("*");
}
System.out.println(); //回车
}
}
传多个参数:
public class HaveArg2 {
public static void main(String[] args) {
System.out.println("床前明月光");
print(10,"*"); //方法调用--实参
System.out.println("疑是地上霜");
print(12,"-"); //方法调用
}
//方法实现(方法定义)
public static void print(int n,String c){ //形参
for(int i=1;i<=n;i++) {
System.out.print(c);
}
System.out.println(); //回车
}
}
3、有参数有返回值方法(常用) 提高了扩展性
方法实现语法结构:
public static 数据类型 方法名(参数){
方法体;
return 值; //值的类型要匹配数据类型
}
方法调用语法结构: 数据类型 变量 = 方法名(实参);
3.1求两个变量的和:
public class HaveReturn1 {
public static void main(String[] args) {
int sum = add(1, 2);
System.out.println("和为:"+sum);
}
//有参数有返回值方法,返回数据类型为int类型
public static int add(int a,int b) {
int sum = a+b;
return sum; //return的值也必须是int类型
}
}
3.2判断是否为素数:
public class HaveReturn2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个正整数:");
int num = scanner.nextInt();
boolean flag = isSuShu(num); //有参数有返回值方法
if(flag) { //判断素数
System.out.println(num+"是素数");
}else {
System.out.println(num+"不是素数");
}
}
public static boolean isSuShu(int num) {
for(int i=2;i<num;i++) {
if(num%i==0) { //找到了除1和本身以外能整除的数
return false; //return会跳出方法体
}
}
return true; //跳出方法体
}
}
4、return的使用
4.1用在有返回值的方法中
特点:方法体的最后必须要有 return 值; 如果用在分支语句中,每个分支都要有return 值;
public class Return1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个正整数:");
int num = scanner.nextInt();
String a = returnResult(num);
System.out.println(num+"是"+a);
}
public static String returnResult(int num) {
if(num%2==0) {
return "偶数";
}else {
return "奇数";
}
}
}
4.2使用在无返回值的方法中
特点: return不能带值--return; 一般用于特殊的退出,而不是放到最后面
public class Return2 {
public static void main(String[] args) {
printNum(10);
}
private static void printNum(int num) {
for(int i=1;i<=num;i++) {
if(i%3==0) {
break; //退出循环
//return; //退出方法体
}
System.out.println(i);
}
System.out.println("方法体结束...");
}
}
4.3return应用案例:
//return应用:请输入取款信息:1.开户 2,取款 3,存款 4,退出
public class Return3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
do {
System.out.println("请输入取款信息:1.开户 2,取款 3,存款 4,退出");
int n = scanner.nextInt();
switch (n) {
case 1:
System.out.println("开户成功");
break;
case 2:
System.out.println("取款成功");
break;
case 3:
System.out.println("存款成功");
break;
case 4:
System.out.println("退出");
System.out.println("执行了退出功能~~~");
return; //跳出函数体
default:
System.out.println("输入有误~~");
break;
}
}while(true);
}
}
5、方法多级调用
方法的多级调用: 方法调用实现后,在实现处,继续调另一个方法的实现
public class Method1 {
public static void main(String[] args) {
System.out.println("main start"); //1
m1();
System.out.println("main end"); //5
}
private static void m1() {
System.out.println("m1 start"); //2
m2();
System.out.println("m1 end"); //4
}
private static void m2() {
System.out.println("m2的执行"); //3
}
}
6、递归方法
递归方法:自己调用自己,必须要有退出的出口,否则就是死递归
说明:如果能用其他方式处理,尽量不要使用递归;
递归有两个弊端: 1.容易出现死递归 2.执行效率很低
应用场景:1.文件操作 2.算法
递归的设计规则类似循环,一般情况下能用循环操作的,都可以使用递归
递归的操作步骤:
1.定义方法,设计有规律的数列(调用自己的规则)
2.必须有退出的出口
6.1求阶乘案例
案例:请求出指定数的阶乘: 4=1*2*3*4=24 3=1*2*3=6
4的阶乘: 4*3的阶乘
3的阶乘: 3*2的阶乘
2的阶乘:2*1的阶乘
1的阶乘:1
public class DiGui1 {
public static void main(String[] args) {
//m1();
//递归操作,往往方法名写的简单; 注意:如果有返回值,则可直接打印方法调用
//求4的阶乘--》24
System.out.println(f(4)); //1*2*3*4
}
private static int f(int n) {///4
if(n==1) {
return 1; //1的阶乘返回1
}
return f(n-1)*n; //
}
private static void m1() {
System.out.println("一直调自己");
m1(); //死递归
}
}
6.2斐波拉切数列
起始第一项为0,第二项为1;从第三项开始,某个项数值=前面两项的和
0 1 1 2 3 5 8 13 21...
public class DiGui2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的项数:");
int num = scanner.nextInt();
for(int i=1;i<=num;i++) {
//第四项的结果=第三项+第二项
System.out.print(f(i)+" "); //f(2)+f(1)+f(2)
}
}
private static int f(int n) {
if(n==1||n==2) {
return n-1;
}
return f(n-1)+f(n-2);
}
}