父类或者接口的引用指向其子类的对象
多态的优点
扩展性强
多态的弊端
只能调用在接口或者父类里面有的内容,无法调用后期子类里面特有的内容
多态的前提
-必须有关系,继承,实现
-要有覆盖
多态的强制转型
Animal a = new cat(); // 向上转型
如果还想用具体猫的特有功能,可以将向下转型
Cat c = (Cat)a;
c.eatMouse();
向下转型目的为了使用特有功能。
instanceof对象类型的判断
这个类似于基本数据类型中的 == <=,通常用于向下转型前
if(a instanceof Cat) //a是不是猫对象,如果是就可以调用Cat的特有方法,只能用于
//引用数据类型判断
转型容易出现问题,所以在转型之前先判断一下,增强代码的健壮性
应用多态时的问题
1.成员变量的问题
class T{
int num =3;
}
class Tt extends T{
int num = 4;
}
class Test{
public static void main(String[] args){
T t = new Tt();
System.out.println("t.num");
}
//结果是3
}
因为new Tt()创建的子类对象,这两个num有3 有4,向上转型后父类的引用变量指向3这个值
注意:覆盖只发生在方法上,跟成员变量没关系
2.方法的问题
class T{
void show(){
System.out.println("father");
}
}
class Tt extends T{
void show(){
System.out.println("son");
}
}
class Test{
public static void main(String[] args){
T t = new Tt();
t.show(); // son
}
子类方法覆盖父类方法
class T{
void show(){
System.out.println("father");
}
}
class Tt extends T{
// void show(){
//System.out.println("son");
//}
}
class Test{
public static void main(String[] args){
T t = new Tt();
t.show(); // father
}
静态方法的问题
class T{
static void show(){
System.out.println("father");
}
}
class Tt extends T{
static void show(){
System.out.println("son");
}
}
class Test{
public static void main(String[] args){
T t = new Tt();
t.show(); // father
}
静态方法这块出现了问题,发现覆盖不管用了,这得从调用非静态方法与静态方法说起
-非静态必须绑定在指定的对象上,通过对象来调用
-静态方法是在类加载的时候存在,不依赖对象,(直接绑定类上面了)
父类的show自始自终就属于父的,子类的show属于子的