多态

父类或者接口的引用指向其子类的对象

多态的优点

扩展性强

多态的弊端

只能调用在接口或者父类里面有的内容,无法调用后期子类里面特有的内容

多态的前提

-必须有关系,继承,实现
-要有覆盖

多态的强制转型

  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属于子的

你可能感兴趣的:(多态)