面向对象(中):
1. 递归
递归就是反复调用自身方法,把一个较大的问题,分解成一个个较小的子问题去解决,同时子问题也能分解成多个更小的子问题
递归要满足的条件:
- 要有已知的方向
- 要有退出的条件
注意:递归是很占用内存空间的,所以尽量不要使用深层次的递归
代码示例:
public class RecursionDemo {
public static void main(String[] args) {
//递归二分查找法
int[] arr = {3,4,76,122,131};
int num = 176;//确定要查找的值
//调用方法,传递数组,初始下表,结尾下标,要查询的数字
int key = search(arr,0,arr.length-1,num);
//判断
if(key != -1) {
System.out.println("要搜索的数字是:" + arr[key] + ",索引是:" + key);
}else {
System.out.println("没有你要搜索的数字!");
}
}
private static int search(int[] arr, int low, int high, int num) {
if(arr.length == 0) return -1;
int l = low;
int h = high;
if(l <= h) {
int mid = (l + h) /2;
if(arr[mid] == num) {
return mid;
}else if(arr[mid] < num) {
l = mid +1;
return search(arr, l, h, num);
}else if(arr[mid] > num) {
h = mid -1;
return search(arr, l, h, num);
}
}
//返回-1
return -1;
}
// 100!阶乘
private static double getSum2(int n) {
if(n == 1) {
return 1;
}
return n * getSum2(n-1);
}
// 1-100的累加
private static int getSum12100(int n) {
//判断
if(n == 1) {
return 1;
}else {
// return 100+99+98...+1
return n + getSum12100(n-1);
}
}
}
2. 继承:
继承是面向对象的三大特征之一
示例:
public A extends B{} //A类继承了B类,A是B的子类
举例:
人 是父类
那么 学生,老师,工人 都是子类
动物 是父类
那么 鸟,猫,狗 都是子类
父类和子类之间是is关系,子类继承了父类之后,就获取了父类中声明的属性和方法,子类可以重写父类的方法
使用继承的原因:
-
需要扩展父类方法和属性
-
展示子类的特点
-
方便代码的复用
java是单继承的,一个子类只能有一个直接父类,但是可以有多个间接父类
Object默认是所有类的父类,叫做"超类"
继承之后,子类可以对父类的方法进行重写,子类和父类之间有了依赖关系,遵循"两同两小一大"原则,即:
- 同一个方法名,同样的形参列表
- 返回类型要相同或更小
- 抛出的异常要相同或更小
- 访问的权限要相同或更大
3. 方法重载:
方法重载就是在同一个类中存在多个方法名相同功能不同的方法
方法重载的条件:
方法名相同,以下某一样不同可构成重载
1. 形参数不同
2. 形参类型不同
3. 形参顺序不同
4. 返回值类型不同
规律: 同名不同参,返回值无关
4. 属性的操作方式
为了维护对象的安全性和封装性,我们通常会把对象的属性隐藏起来,只提供方法来完成对属性的操作
而这些方法就是getter和setter方法
代码示例:
public class Student {
//姓名
private String name;
//年龄
private int age;
//name的getter方法
public String getName() {
return name;
}
//name的setter方法
public void setName(String name) {
this.name = name;
}
//age的getter方法
public int getAge() {
return age;
}
//age的setter方法
public void setAge(int age) {
this.age = age;
}
}
其中get方法用于获取属性的值,set方法用于设置属性的值