15-多态

多态(Polymorphism)

1 引入

  动物园中,看到一头水牛,属于动物;又看到一只鸭,也属于动物;看到一头老虎,属于动物。我们可以这样想:
    Animal animal1 = new 水牛();
    Animal animal2 = new 鸭子();
    Animal animal3 = new 老虎();
  先有了动物的概念,才有了物种的分类。这就体现出多态!!!

2 引用变量的特殊

  引用变量有两个类型:一个是编译时类型,一个是运行时类型
    1、编译时类型:编译时类型由声明该变量时使用的类型决定。
    2、运行时类型:运行时类型由实际赋给该变量的对象决定。
在这里插入图片描述

3 多态的出现:

如果编译时类型和运行时类型不一致,就可能出现所谓的多态。
重要一段话:
  当把一个子类变量直接赋值给父类引用变量时,例如Fu04 ployName3 = new Zi04();这个ployName3引用变量的编译时类型为Fu04,而运行时类型是Zi04,当运行时调用该引用变量的方法时,其方法行为总是表现出其子类方法的行为特征,而不是父类方法的行为特征。这就可能出现:相同类型的变量调用同一方法时呈现出不同的行为特征,这就是多态

注意一点:
  与方法不同的是,对象的实例变量不存在多态性。

4 多态中成员变量的访问特点

编译看父类,运行看父类

在这里插入图片描述

5 多态中成员方法的访问特点

编译看父类,运行看子类
在这里插入图片描述

6 多态的好处和弊端

好处:
  提高程序的扩展性。
    定义的时候,使用父类型作为参数
    在使用的时候,使用具体的子类型参与操作。
弊端:
  不能使用子类的特有成员。

7 解决弊端的方法

7.1 多态中的转型

  • 向上转型
    从子到父:父类引用指向子类对象
    向上转型体现多态优点。

  • 向下转型
    从父到子:父类引用转为子类对象
    向下转型避免多态弊端。
    在这里插入图片描述

8 引用变量的强制类型转换

  引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它所引用的对象确实包含该方法。
   如果需要让这个引用变量调用它运行时类型的方法,则必须把它强制类型转换为运行时类型。强制类型转换需要借助于类型转换运算符。
  引用类型之间的转换只能在具有继承关系的两个类型之间进行,如果是两个没有任何继承关系的类型,则无法进行类型转换,否则编译时会出现错误。
  如果试图把一个父类实例转换成子类类型,则这个对象必须实际上是子类实例才行(即编译时类型为父类类型,而运行时类型是子类类型),否则将在运行时引发ClassCastException异常。
  
在这里插入图片描述

示例代码:

package Class;

public class ConversionTest {
    public static void main(String[] args) {
        double d = 13.4;
        long l = (long)d;
        System.out.println(l);

        int in = 5;
        // 试图把一个数值类型的变量转换为boolean类型,下面代码编译出错
        // 编译时会提示:不可转换的类型
        //boolean b = (boolean) in;

        Object obj = "Hello";
        // obj 变量的编译时类型为Object,Object与String存在继承关系,可以强制类型转换
        // 而且obj变量的实际类型是String,所以运行时也可以通过
        String objStr = (String) obj;
        System.out.println(objStr);

        // 定义一个objPri变量,编译时类型为Object,实际类型为Integer
        Object objPri = new Integer(5);
        // objPri变量的编译时类型为Object,objPri的运行时类型为Integer
        // Object与Integer存在继承关系
        // 可以强制类型转换,而objPri变量的实际类型是Integer
        // 所以下面代码运行时引发ClassCastException异常
        //String str = (String)objPri;

        // 在进行强制类型转换前,先用instanceof运算符判断是否可以成功转换。
        if(objPri instanceof String){
            String str1 = (String)objPri;
        }else {
            System.out.println("不可以成功转换");
        }
    }
}

instanceof运算符

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值