Java高级--多态

1、什么是多态

  • 同一个引用类型(Pet),使用不同的实例(Dog或Cat),调用同一个方法(子类重写过的),导致最终执行结果不同。

    • 简单理解:父类引用指向子类对象

    • public class Master {
          public void feed(Pet pet){
              pet.eat();//所有的pet都有eat方法,不同的子类有不同的eat方法
          }
      }

2、如何实现多态

  • 实现多态的三个要素

    • 编写具有继承关系的父类和子类

    • 子类重写父类的方法

    • 父类引用指向子类对象

      • 向上转型(自动类型转换)

      • Pet pet = new Dog();

  • 使用多态的两种形式

    • 使用父类作为方法形参,子类作为方法实参

    • 使用父类作为方法返回值类型,使用子类作为方法返回值

    • public Pet adopt() {
          System.out.println("请选择你要的宠物:1.狗 2.猫");
          Scanner scanner = new Scanner(System.in);
          int choose = scanner.nextInt();
          Pet pet;
          if (choose == 1){
              pet = new Dog();//真正领养的宠物是狗
          } else {
              pet = new Cat();//真正领养的宠物是猫
          }
          return pet;
      }

3、方法的重写和重载

4、向上转型和向下转型

  • 向上转型 Pet pet = new Pet()

    • 只能使用Pet中声明的方法,但实际上使用的是子类重写的方法

  • 向下转型 Dog dog = (Dog) pet;

    • 因为经过向上转型,pet无法再使用dog的方法(父类引用无法使用子类独有的方法),如果想使用,可以再向下转型,转回dog

    • 向下转型有时候会出现异常ClassCastException,原因是真正的实例无法转换成目标类型

    • 为了防止出现该异常应该在向下转型之前判断一下对象的类型

    • if (pet instanceof Cat){
          Cat cat = (Cat) pet;
          cat.play();
      } else {
          System.out.println("这不是一只猫");
      }
  • instanceof 判断一个对象的类型

    • 所有的类都有共同的祖先类Object

    • Cat cat = new Cat();
      System.out.println("是否为Cat类:" + (cat instanceof Cat));//true
      System.out.println("是否为Pet类:" + (cat instanceof Pet));//true
      System.out.println("是否为Object类:" + (cat instanceof Object));//true

5、包装类

  • 本来Object是所有类的祖先类,但是基本数据类型不属于类,所以一个方法的参数是Object,基本数据类型原本是放不进去的,但是java为我们提供了包装类,基本数据类型和它的包装类之间是自动转换的,所以即使一个方法的参数是Object,也可以将基本数据类型放进去

  • 基本数据类型对应的包装类

    • byte-->Byte

    • short-->Short

    • int --> Integer

    • long --> Long

    • char --> Characher

    • boolean --> Boolean

    • float --> Float

    • double --> Double

  • 基本数据类型和它的包装类之间是自动装箱和自动拆箱的

  • 特殊情况

    • double a = 1;//自动类型转换
      Double b = 1;//错误,不能在装箱的同时进行自动类型转换
  • 包装类的主要作用是可以让基本数据类型作为Object类型使用

  • 包装类的方法

    • parseInt

      • String str = "123";
        int a = Integer.parseInt(str);
    • parseDouble

09-10 117
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值