Java学习-面向对象编程的三大特性(多态)

一、含义

含义:指对象的多种形态。
对象多种形态:1、引用的多态。2、方法的多态。

1.1 引用的多态

1.1.1 父类的引用指向父类的对象

语法:父类名 对象名 = new 父类名();

Animal obj1 = new Animal();

1.1.2 父类的引用指向子类的对象

语法:父类名 对象名 = new 子类名();

Animal obj2 = new Dog();
项目含义
含义同一个接口,使用不同的实例,进而执行不同的操作
优点灵活、简化、接口性,可替换、扩充性,消除类型间的耦合关系
必要条件继承、重写、父类引用指向子类对象。

1.2 方法的多态

1.1.1 本类对象调用本类方法

语法:本类对象名.本类独有方法();

// watchDoor方法是狗类独有的方法。
obj2.watchDoor();

1.1.2 子类对象调用父类重写的方法或继承的方法

// 狗类重写eat方法。
obj2.eat();
// 猫类为重写eat方法。只是继承了动物类。
Cat obj3 = new Cat();
obj3.eat();

1.1.3 方法多态调用步骤

(1)查看是否有继承关系。无,则无多态特性。
(2)查看父类是否有该方法。无,则直接调用子类该方法。
(3)查看子类是否重写该方法。无,则直接继承调用父类该方法。
(4)调用子类重写后的该方法。

1.3 多态的实现方式

1.3.1 方式一——重写

1.3.2 方式二——接口

1.3.3 方式三——抽象类和抽象方法。

1.4 实参

实参类型示例
基本数据类型cat.eat(“苹果”);
引用数据类型num.findMax(arr1);
实例对象eat(new Cat());

1.5 引用数据类型转换——父子间

1.5.1 非强制转换

别名:向上类型转换、隐式类型转换或自动类型转换。
使用条件:小类型转换到大类型。即子转父。

Dog dog = new Dog();
Animal animal = dog; // 自动类型提升,即向上类型转换。狗dog转为动物dog

1.5.2 强制转换

别名:向下类型转换或强制类型转换。
使用条件:大类型转换到小类型。即父转子

Animal animal = new Animal();
Dog dog = (Dog)animal; // 强制转换,即向下类型转换。动物animal转为狗animal。
//Cat cat = (Cat)animal; // 出错。原因,此时animal已经强制转换为狗类了,与猫类没有继承关系。
// 解决出错方法。使用instanceof运算符。
if(animal instanceof Cat){
  Cat cat = (Cat)animal;
}else{
   System.out.println("他们没有继承关系!无法进行转换!");
}

二、实例

动物:猫、狗。
主函数入口类:

public class MainEntrance{
  public static void main(String[] args){
    /*  类方法调用:实例对象作为实参。
     * 等价于:
     * Cat a = new Cat();
     * show(a);
     * 或者
     * Animal b = new Cat(); // 多态方式。
     */
    show(new Cat()); 
    show(new Dog());
    
    Animal a = new Cat();
    a.eat();
    Cat c = (Cat)a;
    c.work();
  }
  public static void show(Animal a){ // 多态方式。父类引用,指向子类。
    a.eat(); // 多态方式调用方法:先看父有无后调子方法。
    if(a instanceof Cat){ // 判断实例对象的类型。此时只知道a是动物。
       Cat c = (Cat)a; // 强制转换
       c.work();
     }else if(a instanceof Dog){
       Dog c = (Dog)a;
       c.work();
     }     
    }
  }  
}

动物类:

public class Animal{
  public void eat(){
    System.out.println("都需要食物补充营养!");
  }
}

类:

public class Cat extends Animal{
  public void eat(){
    System.out.println("喜欢吃鱼");
  }
  public void work(){
    System.out.println("任务是抓老鼠!");
  }
}

类:

public Dog extends Animal{
  public void eat(){
    System.out.println("喜欢吃骨头!");
  }
  public void work(){
    System.out.println("任务是看家护院!");
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值