目录
1. 方法的使用
1.1 什么是方法(method)
方 法 就 是 一 个 代 码 片 段. 类 似 于 C 语 言 中 的 " 函 数 ".
方法存在的意义(不要背, 重在体会):
1. 是能够模块化的组织代码(当代码规模比较复杂 的 时 候 ).
2. 做到代码被重复使用, 一份代码可以在多个位置使用.
3. 让代码更好理解更简单.
4. 直接调用现有方法开发, 不必重复造轮子.
1.2 方法的语法
// 方法定义
public static 方法返回值 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}
// 方法调用
返回值变量 = 方法名称(实参...);
1.3 方法的使用
//实现两个整数相加
public class Demo {
public static int add(int x, int y) {
return x+y;
}
public static void main(String[] args) {
int ret = add(10,20);
System.out.println("ret = " + ret);
}
}
// ret = 30
2. 方法的重载
在一些特定的情况下我们需要用一个函数同时兼容多种参数的情况, 我们就可以使用到方法重载.
2.1 方法重载的规则
方法名相同
参数列表不相同(数据类型,顺序,个数)
返回值与判断条件无关
2.2 代码示例
// 通过方法的重载 实现 两个整数/三个整数 相加
public class Demo {
public static int add(int x, int y) {
return x+y;
}
public static int add(int x,int y,int z) {
return x+y+z;
}
public static void main(String[] args) {
int ret = add(10,20);
System.out.println("ret = " + ret);
int ret2 = add(10,20,30);
System.out.println("ret2 = " + ret2);
}
}
//返回值
//ret = 10
//ret2 = 60
3. 方法的重写
3.1 关于重写的规则
1. 重写和重载完全不一样. 不要混淆
2. 普通方法可以重写, static 修饰的静态方法不能重写
3. 重写中子类的方法的访问权限不能低于父类的方法访问权限
4. 重写的方法返回值类型不一定和父类的方法相同(但是建议最好写成相同, 特殊情况除外).
3.2 方法重写代码示例
// 定义一个Student类
public class Student {
public String name;
public int age;
public Student(String name,int age) {
this.name = name;
this.age = age;
}
}
// 实例化一个对象
public class Demo2 {
public static void main(String[] args) {
Student student = new Student("张三",18);
System.out.println(student);
}
}
// 输出结果
// Student@3b07d329
// 我们发现这里打印的是一个地址的哈希值 原因:调用的是Object的toString方法
我们通过后面的学习可以知道,我们自己定义的类是默认继承Object类的
当我们对 toString 方法重写后,我们在mian方法中调用toString 方法就好使用我们重写后的toString 方法
3.3 重写的注意事项
- toString 方法会在 println 的时候被自动调用.
- 将对象转成字符串这样的操作我们称为 序列化.
- toString 是 Object 类提供的方法, 我们自己创建的 Person 类默认继承自 Object 类, 可以重写 toString 方法实 现我们自己版本的转换字符串方法.
- @Override 在 Java 中称为 "注解", 此处的 @Override 表示下面实现的 toString 方法是重写了父类的方法.
- IDEA快速生成Object的toString方法快捷键:alt+insert(然后选择toString)
4. 重载和重写的区别
4.1 重载
方法名相同
产生列表不相同(数据类型,顺序,个数)
与返回值无关
4.2 重写
方法名相同
产生列表相同
返回值相同
5. 方法的递归
5.1 递归的概念
递归就是函数调用自己本身,将大事情化成小事情就是规
例如, 我们求 N!
起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.
递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!
5.2 代码示例:递归求N的阶层
public static void main(String[] args) {
int n = 5;
int ret = factor(n);
System.out.println("ret = " + ret);
}
public static int factor(int n) {
if (n == 1) {
return 1;
}
return n * factor(n - 1); // factor 调用函数自身
}
// 执行结果
//ret = 120
5.3 递归执行过程图
程序按照序号中标识的 (1) -> (8) 的顺序执行.
5.4 递归小结
- 递归是一种重要的编程解决问题的方式.
- 有些问题天然就是使用递归方式定义的(例如斐波那契数列, 二叉树等), 此时使用递归来解就很容易.
- 有些问题使用递归和使用非递归(循环)都可以解决. 那么此时更推荐使用循环, 相比于递归, 非递归程序更加高效.