方法递归
那些场景下可以使用递归解决问题?
1.一个大问题可以拆分成多个子问题的解
2.拆分后的子问题和原问题除了数据规模不一样,他们解决思路完全相同
3.存在递归终止条件。
如何写出递归代码?
一定要注意方法的语义(这个方法能做什么),不要纠结这个递归如何实现
需要思考如何使用这个方法解决问题
Eg:使用递归方法实现一个数的阶乘
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int num= scanner.nextInt();
System.out.println(jieCheng(num)+" "+factor(num));
}
public static int jieCheng(int num){
int n=1;
for (int i = 1; i <=num ; i++) {
n*=i;
}
return n;
}
//传入一个值就能返回他的阶乘
public static int factor(int num ){
//终止条件
if(num==1){
return num;
}
//拆分问题
//现在已经知道num但是不知道num-1的结果,因此将num-1交给factor
return num*factor(num-1);
}
通过父类型引用指向子类对象、通过接口回调实现多态。
多态中涉及到的概念:
向上转型、向下转型(强制类型转换,需要加强制类型转换符)
eg:动物为父类、猫、狗为子类
class 动物{
public void sheng(){
System.out.println("动物的声音");
}
}
class cat extends 动物 {
public void sheng(){
System.out.println("喵喵");
}
public void eat(){
System.out.println("一条小鱼");
}
}
class dog extends 动物{
public void sheng(){
System.out.printl("汪汪");
}
public void eat(){
System.out.println("骨头");
}
}
public class yunxing{
public static void main(string[]args){
动物 c1=new cat();//上转型、自动类型转换
c1.sheng();
动物 c2=new dog();
dog b1=(dog)c2;//下转型。这个就是强制类型转换。
}
}
上转型只要编译通过,运行就不会出错。
下转型当对象之间不存在继承关系,运行会报错。
如:动物a3 = new dog(); cat c3 =(cat)a3
为了避免这种错误,可以使用instanceof运算符;
instanceof
1.语法格式:
(引用 instanceof 数据类型名)
2.运算符的执行结果类型是布尔类型,(true、false)。
3.引用格式:
假设(c3 instanceof cat)
ture表示引用指向的对象是cat类型,false表示不是。
eg:
if(a3 instanceof cat){
cat c3=(cat)a3;
c3.方法名();
}else if(a3 instanceof dog){
dog b3=(dog)a3;
b3.方法名();
}
内部类
1.内部类分为:成员内部类、静态内部类(方法构造时加static)、局部内部类(只在一定范围内作用,超出区域无法访问)、匿名内部类
2.访问时,内部类可以直接访问外部类中的成员,包括私有成员。访问方式:外部类名.this
但是外部类去访问内部类时必须要建立内部类的对象。
eg:成员内部类
//调用时主方法中
A p1=new A();
A.B b=p1.new B();
//
class A{
int a;
public void h(){
System.out,println("这是外部类");
}
class B{
public void c(){
System.out.println("这是内部类");
}
}
}
匿名内部类就是在调用时格式:new 外部类名或接口名(){
代码体(可自定义)
}