java面向对象——多态(超详细讲解)

Java多态性:Java什么是多态?

多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

# 多态:简而言之就是父类型引用指向子类型对象

包括编译时多态和运行时多态:

  • - 编译时:静态绑定的父类
  • - 运行时:动态绑定的时子类中的方法


Java实现多态有 3 个必要条件:继承、重写和向上转型。只有满足这 3 个条件,才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。

  • 继承:在多态中必须存在有继承关系的子类和父类。子类能够继承父类
  • 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  • 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。

1. 向上转型、向下转型的概念:向上转型:子————》父

下面通过一个例子来演示重写如何实现多态性。

  无论是向上还是向下转型,两个类之间必须有继承关系,负责报错;;

public class test02 {
       public static void main(String[] args){
           Animal c = new cat();//向上转型,,子类型指向父类型
           c.move();   //猫cat
       }
   }
   class Animal{
       public void move(){
           System.out.println("动物");
       }
   }
   class cat extends Animal{
       public void move(){
           System.out.println("猫cat");
       }
   }

2.什么时候必须使用“向下转型”,,父类型指向子类型,需要加强制类型转换符

  • ​   当你需要访问的子类对象中“特有”的方法,父类中没有的,则需要进行向下转型。
public class test02 {
    public static void main(String[] args){
        Animal c = new cat();//向上转型,,子————》父
        //因为c是Animal类型,所以需要转成Cat类型。。
        cat x = (cat)c;
        x.catchMonths();        //猫抓老鼠
    }
}
class Animal{
    public void move(){
        System.out.println("动物");
    }

}
class cat extends Animal{
    public void move(){
        System.out.println("猫cat");
    }
    public void catchMonths(){
        System.out.println("猫抓老鼠");
    }
}

注意:向下转型时是有风险的

通常会出现这种运行时报错:`java.lang.ClassCastException`

而怎么避免java.lang.ClassCastException的出现呢????

则需要引入新的运算符:instanceof------->语法:(引用 instanceof  类型)

例如,如果c是一个cat,则进行向下转型,否则~~~~

对象**运算符**(**instanceof**)用来判断一个对象是否属于某个指定的类或其子类的实例,如果是,返回真(true),否则返回假(false)。

public class test02 {
    public static void main(String[] args){
        Animal c = new cat();
        Animal b = new Birld();
        if(c instanceof cat){
            cat x = (cat)c;
            x.catchMonths();    //猫抓老鼠!
        } else if (c instanceof Birld) {
            Birld x = (Birld) c;
            x.sing();
        }
        if(b instanceof cat){
            cat y = (cat)b;
            y.catchMonths();
        } else if (b instanceof Birld) {
            Birld y = (Birld)b;
            y.sing();       //鸟在唱歌!
        }
    }
}
class Animal{ }
class cat extends Animal{
    public void catchMonths(){
        System.out.println("猫抓老鼠!");
    }
}
class Birld  extends Animal{
    public void sing(){
        System.out.println("鸟在唱歌!");
    }
}

3、继承和重写的相关知识点将在后续文章中介绍到,长期更新,坚持原创


版权声明:本文为Best_Basic原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。