目录

  • Java开发入门
    • ● Java 概述
    • ● JDK的使用
    • ● 系统环境变量
    • ● 第一个Java程序
    • ● Java的运行机制
    • ● 教学设计
    • ● 课程讲义
    • ● 案例学习
    • ● 课后题答案
  • Java 编程基础
    • ● Java的基本语法
      • ● Java代码基本格式
      • ● Java中的注释
      • ● Java中的关键字
      • ● Java中的标识符
    • ● Java中的变量与常量
      • ● 变量的定义
      • ● 变量的数据类型
        • ● 案例导学
      • ● 变量的类型转换
        • ● 案例导学-自动类型转换
        • ● 案例导学-强制类型转换
      • ● 变量的作用域
        • ● 案例导学-作用域
      • ● Java中的常量
    • ● Java中的运算符
      • ● 案例导学-算术运算符
      • ● 案例导学-赋值运算符
      • ● 案例导学-比较运算符
      • ● 案例导学-逻辑运算符
      • ● 案例导学-位运算符
      • ● 案例导学-运算符的优先级
    • ● 选择结构语句
      • ● 案例导学-if条件语句
      • ● 案例导学-switch条件语句
    • ● 循环结构语句
      • ● 案例导学-while循环语句
      • ● 案例导学-for循环语句
      • ● 案例导学-循环嵌套
      • ● 案例导学-break语句
      • ● 案例导学-continue语句
    • ● 数组
      • ● 案例导学-一维数组的定义
      • ● 案例导学-数组最值
      • ● 案例导学-数组排序
    • ● 教学设计
    • ● 课程讲义
    • ● 课后题答案
  • 面向对象(上)
    • ● 面向对象概述
    • ● Java中的类与对象
      • ● 案例导学-类与对象
    • ● 类的封装
    • ● 案例导学-类的封装
    • ● 方法的重载和递归
    • ● 构造方法
      • ● 案例导学-构造方法与重载
    • ● this关键字
      • ● 案例导学-this
    • ● static关键字
      • ● 案例导学-静态变量
      • ● 案例导学-静态方法
      • ● 案例导学-静态代码块
    • ● 教学设计
    • ● 课程讲义
    • ● 章节测试
    • ● 课后题答案
  • 面向对象(下)
    • ● 类的继承
      • ● 案例导学-类的继承
      • ● 案例导学-方法的重写
      • ● 案例导学-super访问父类成员变量
      • ● 案例导学-super访问父类成员方法
      • ● 案例导学-super访问父类构造方法
    • ● final关键字
    • ● 抽象类和接口
    • ● 多态
    • ● 内部类
    • ● JDK8的Lambda表达式
    • ● 异常
    • ● 垃圾回收
    • ● 教学设计
    • ● 课程讲义
    • ● 章节测试
    • ● 课后习题答案
  • Java中的常用类
    • ● String类和StringBuffer类
    • ● System类与Runtime类
    • ● Math类与Random类
    • ● 包装类
    • ● 日期与时间类
    • ● 格式化类
    • ● 课后题答案
    • ● 课程讲义
  • 集合
    • ● 集和概述
    • ● Collection接口
    • ● List接口
      • ● List接口简介
      • ● ArrayList集合
      • ● LinkList集合
    • ● Collection集合遍历
    • ● Set接口
    • ● Map接口
    • ● 泛型
    • ● 常用工具类
      • ● Collections工具类
      • ● Arrays工具类
    • ● 课后题参考答案
    • ● 课程讲义
  • IO流
    • ● I/O流概述
    • ● 字节流
    • ● 字符流
    • ● File类
    • ● RandomAccessFile
    • ● 对象序列化
    • ● NIO
    • ● NIO.2
    • ● 课后题答案
    • ● 课程讲义
    • ● 章节测试
  • GUI(图形用户接口)
    • ● Swing概述
    • ● Swing顶级容器
    • ● 布局管理器
    • ● 事件处理
    • ● Swing常用组件
    • ● Swing组件的整合使用
    • ● JavaFX图形用户界面工具
    • ● 课程讲义
  • JDBC
    • ● 什么是JDBC
    • ● JDBC常用API
    • ● JDBC编程
    • ● 案例-使用JDBC实现QQ登录
    • ● 课程讲义
  • 多线程
    • ● 线程概述
    • ● 线程的创建
    • ● 线程的生命周期及状态转换
    • ● 线程的调度
    • ● 多线程同步
    • ● 多线程通信
    • ● 教学设计
    • ● 课后题参考答案
    • ● 课程讲义
  • 网络编程
    • ● 网络通信协议
    • ● UDP通信
    • ● TCP通信
    • ● 课程讲义
  • Eclipse开发工具
    • ● Eclipse概述
    • ● Eclipse的安装与启动
    • ● Eclipse进行程序开发
    • ● Eclipse程序调试
    • ● 使用Eclipse导出、导入jar文件
  • ACM大赛题库
    • ● 2027
    • ● 2028
    • ● 2024-2026
    • ● 2012-2023
    • ● 2018-2020
    • ● 2015-2017
    • ● 2012-2014
    • ● 2009-2011
    • ● 2003-2005
    • ● 2000-2002
  • PBL学生风采展示
    • ● 实验一
    • ● 实验二
    • ● 实验三
    • ● 实验四
方法的重载和递归



一、方法的重载

1. 什么是方法的重载(Overload)?

方法的名称相同,但是参数列表不同。

2. 什么叫参数列表不同?

参数列表不同有下列三种情况,均可以形成重载。

  • 1. 参数的个数不同
    下面两个方法的方法名相同,但参数数量不同,可以形成重载

public static int sum(int a, int b) {...}
public static int sum(int a, int b, int c) {...}
  • 2. 参数的类型不同
    下面两个方法形参的类型不同,一个是int类型,一个是double类型,可以形成重载

public static int sum(int a, int b) {...}
public static double sum(double a, double b) {...}
  • 3. 参数的多类型顺序不同
    下面两个方法各有两个形参,都是intdouble类型,但排列顺序不同,依然可以形成方法重载

public static double sum(int a, double b) {...}
public static double sum(double a, int b) {...}

3. 重载与什么因素无关?

  • 1. 与返回值类型无关
    下面两个相同方法名、不同返回值的方法无法形成重载。

public static int sum(int a, int b) {...}
public static String sum(int a, int b) {...}

为什么不能重载?假如方法有返回值,方法的调用有三种:单独调用、赋值调用和打印调用。我们可以想像,如果返回值类型不同可以重载,其中赋值调用和打印调用可以区分,但单独调用的时候我们并不使用返回值,所以无法区分!所以重载与返回值类型无关。

  • 2. 与参数名称无关
    下面两个方法形参名不同,但不能形成重载,因为传参过程中使用的是参数里面的值,而不是参数是什么变量名。

public static int sum(int a, int b) {...}
public static int sum(int x, int y) {...}




对于一个复杂的问题,把原问题分解为如干个相对简单前类同的子问题,继续下去至到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解。 
关键要抓住的是:
    1.递归出口 
    2.递推逐步向出口逼近 

斐波纳契数列,其通项公式为:F(0)=0,F(1)=1,Fn=F(n-1) +F(n-2)(n>=3,n∈N*),现在求F(6)的值,怎么做呢?观察:这个数列从第三项开始,每一项都等于前两项之和。要求F(6)的值,肯定要先求F(5)和F(4)的值,而求F(5)的值又需要求F(4)和F(3)的值... ...解决办法1:依次求出F(1)、F(2)、F(3)、F(4),F(5)值,再处理,如下图所示:


递归程序如下:
public class Recursion
{
static int fn(int n)
{
 if(n==0)
 {
  return 0;
 }
 else if(n==1)
 {
  return 1;
 }
 else
 {
  return Recursion.fn(n-1)+Recursion.fn(n-2);
 }
}
public static void main(String[] args)
{
 int result=Recursion.fn(6);
 System.out.println("fn(5)="+result);
}
}