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、继承和重写的相关知识点将在后续文章中介绍到,长期更新,坚持原创

  • 3
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

-今非昔比°

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值