定义:定义一个操作中的算法骨架,将通用步骤以模板形式封装在父类模板中,将具体细节步骤延迟到子类中实现。
不同的实现类,重写的抽象方法的逻辑不同,导致算法执行的结果也不相同,但是算法骨架是没有改变的。
定义: 多态是指同一行为,具有多个不同表现形式
编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。
Java实现运行时多态有 3 个必要条件:继承、重写和向上转型
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。
父类类型 变量名 = new 子类对象;
变量名.方法名();
注意:当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后的方法。
实际开发中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体现出多态的扩展性与便利。
编译看左边,运行看左边,所有的成员变量取决于编译时类型
编译看左边,运行看右边。所以的成员方法取决于运行时类型
编译看左边,运行看右边。所以的静态方法取决于编译时类型
多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。
父类类型 变量名 = new 子类类型();
如:Animal a = new Cat();
父类类型向子类类型向下转换的过程,这个过程是强制的
子类类型 变量名 = (子类类型) 父类变量名;
如:Cat c =(Cat) a;
为了避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验,格式:变量名 instanceof 数据类型
定义:在一个类A中定义一个类B,那么类A成为外部类,类B成为内部类
class 外部类 {
// 成员变量
// 成员方法
class 内部类{
}
}
1.内部类可以直接访问外部类的成员,包括私有成员
2.外部类要访问内部类的成员,必须要建立内部类的对象。
静态内部类:静态内部类是指使用static修饰的内部类。
public class Outer {
static class Inner {
// 静态内部类
}
}
1.在创建静态内部类的实例时,不需要创建外部类的实例
2.静态内部类可以直接访问外部类的静态成员,如果要访问外部类的实例成员,则需要通过外部类的实例去访问。
局部内部类:局部内部类是指在一个方法中局部位置定义的内部类。
public class Outer {
public void method() {
class Inner {
// 局部内部类
}
}
}
1.局部内部类与局部变量一样,不能使用访问控制修饰符(public、private、protected)和static修饰符修饰;
2.局部内部类只在当前方法中有效;
3.局部内部类中不能定义static成员。
匿名内部类:是内部类的简化写法,它的本质是一个带具体实现的父类或者父接口的匿名的子类对象。
new 父类名或者接口名(){
// 方法重写
@Override
public void 方法名() {
// 执行语句
}
};
存在一个类或者接口,这里的类可以是具体类,也可以是抽象类。