【Java学习专题】简单易懂的Java多态

什么是多态?

多态:就是同一种行为(如move()),作用在不同的对象上(如cat、bird),有不同的表现结果(如cat走猫步,bird会飞翔)。还在于java支持父类型引用指向子类型对象(向上转型,也就是自动转型)。

怎么实现多态?(原理:以cat.move()为例)

一、编译阶段——静态绑定

在编译阶段,对编译器来说,他只知道cat的类型是Animal,然后就会直接到Animal.class字节码文件中找move()方法,找到了则编译通过,静态绑定成功。

二、运行阶段——动态绑定

在运行阶段,实际上在堆内存中创建的java对象是cat对象,所有cat调move()方法的时候,真正参与move的对象是一只猫,所有运行阶段会动态的执行cat对象的move()方法,这个过程就是运行阶段的绑定。

代码实例:

/**
 * @author Jason
 * @create 2020-04-23 15:31
 * 测试类
 */
public class AnimalTest {
  public static void main(String[] args) {
    Animal cat1 = new Cat();
    cat1.move();

    Animal bird1 = new Bird();
    bird1.move();

    Cat cat=(Cat)cat1;
    cat.catchMouse();

    Bird bird = (Bird)bird1;
    bird.sing();
  }
}


/**
 * @author Jason
 * @create 2020-04-23 15:22
 * 父类:动物类
 */
public class Animal {
  public void move(){
    System.out.println("动物在行走...");
  }
}


/**
 * @author Jason
 * @create 2020-04-23 15:27
 * 子类:鸟类
 */
public class Bird extends Animal {
  /**
   * 重写父类的方法
   */
  public void move(){
    System.out.println("鸟儿自由飞翔...");
  }

  /**
   * 子类特有的方法
   */
  public void sing(){
    System.out.println("鸟儿在唱歌...");
  }
}


/**
 * @author Jason
 * @create 2020-04-23 15:24
 * 子类:猫类
 */
public class Cat extends Animal {
  /**
   * 重写父类的方法
   */
  public void move(){
    System.out.println("猫在走猫步...");
  }

  /**
   * 子类特有的方法
   */
  public void catchMouse(){
    System.out.println("猫在抓老鼠...");
  }
}

怎么转型?

一、向上转型(子类型向父类型转换—自动转)

例如:Animal cat = new Cat();我们经常这样使用,自动就转换了。

二、向下转型(父类型向子类型转换—强制转)

这种转换什么时候用呢?——当我们需要访问到子类型对象中特有的方法的时候用到。

例如:

Animal cat1 = new Cat();
cat1.move();

Cat cat=(Cat)cat1;
cat.catchMouse();

综合代码实例:(多态机制的应用,面向抽象,不面向具体编程)

/**
 * @author Jason
 * @create 2020-04-23 16:22
 */
public class PetTest {
  public static void main(String[] args) {
    Master jason = new Master();
    Dog diandian = new Dog();
    jason.feed(diandian);
  }
}

/**
 * 主人类
 */
public class Master {
  //面向抽象编程,不面向具体编程
  //多态机制的体现
  public void feed(Pet pet){
    pet.eat();
  }
}


/**
 * 父类:宠物类
 */
public class Pet {
  public void eat(){

  }
}


/**
 * @author Jason
 * @create 2020-04-23 16:18
 */
public class Dog extends Pet {
  public void eat(){
    System.out.println("主人给狗狗吃骨头...");
  }
}

/**
 * @author Jason
 * @create 2020-04-23 16:19
 */
public class Cat extends Pet {
  public void eat(){
    System.out.println("猫咪喜欢吃主人给的小鱼...");
  }
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术蜗牛-阿春

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值