面向对象三大特性-多态的思考(代码片段)

dreamyu dreamyu     2023-05-05     612

关键词:

  无论是python语言,还是java语言都有着面向对象的特性,而面向对象三大特性(封装,继承,多态)中封装和继承是比较容易理解的,多态的话自己一直处于一个似懂非懂的状态。比如一些概念性的东西:

  多态的要点:
      1. 多态是方法的多态,不是属性的多态(多态与属性无关)。
      2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。
      3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
  
  对象类型的转换:
  1. 向上可以自动转换类型,由子类转换成父类!
  2. 向下(由父类转换成子类)强制类型转换!以调用该对象特有的方法!

 

  这些概念性的知识都明白了,但是对于多态的意义及在实际代码中的作用还是很模糊的,因此重新梳理思考了下。

  模拟了以下一个场景:

  人可以养一些宠物,可以喂养宠物,可以逗宠物玩。

  (人类,宠物类,人的一些方法,宠物的一些方法)

 

  如果是没有使用多态的情况下,代码应该是这样的:

public class PersonNotUsePolymorphic 
    public static void main(String[] args) 

        Dog2 dog2 = new Dog2();
        Cat2 cat2 = new Cat2();
        Bird2 bird2 = new Bird2();
        Chicken2 chicken2 = new Chicken2();

        PersonNotUsePolymorphic person = new PersonNotUsePolymorphic();

        person.feedDog(dog2);
        person.feedCat(cat2);
        person.makeBirdFly(bird2);
        person.makeChickenFly(chicken2);

    
   // 喂狗
    public void feedDog(Dog2 dog2) 
        dog2.eat();
    
   // 喂猫
public void feedCat(Cat2 cat2) cat2.eat();    // 放飞小鸟 public void makeBirdFly(Bird2 bird2) bird2.fly();    // 放飞小鸡 public void makeChickenFly(Chicken2 chicken2) chicken2.fly(); class Dog2 void eat() System.out.println("骨头"); class Cat2 void eat() System.out.println("吃鱼"); class Bird2 void eat() System.out.println("吃虫子"); void fly() System.out.println("i can fly i am bird"); class Chicken2 void eat() System.out.println("吃玉米"); void fly() System.out.println("i can fly i am chicken");

  可以看到有狗,猫,鸟,鸡四种宠物,它们都可以吃东西,但是鸟和鸡可以飞,如果没有多态,人如果要喂养宠物或者放飞宠物就需要写多个方法,有几个宠物就要写几个方法,如果以后家里又多了好多宠物,就要写好多的方法。

  并且宠物之间的关系,相关的动作属性都没有层次关系,非常的独立,是面向对象了(如果再多有几个宠物,就更无法梳理之间的关系共性),但是并没有体现面向对象的特性

  我们看下如果使用面向对象的思想,应该如何处理。

public class PersonUsePolymorphic 

    public static void main(String[] args) 
        PersonUsePolymorphic p = new PersonUsePolymorphic();
        Animal dog = new Dog();
        p.feed(dog);
        Animal cat = new Cat();
        p.feed(cat);
        FlyAnimal bird = new Bird();
        p.makeAnimalFly(bird);
        FlyAnimal chicken = new Chicken();
        p.makeAnimalFly(chicken);
    

    public void feed(Animal animal) 
        animal.eat();
    

    public void makeAnimalFly(FlyAnimal flyAnimal) 
        flyAnimal.fly();
    


/**
 * 抽离抽象类动物
 * 抽离出抽象方法:吃东西(必须实现)
 * 可以很清晰看出公共的特性,缕出层次关系
 */
abstract class Animal
    abstract void eat();


/**
 * 抽离出飞行接口(java不能多继承)
 * 因为不是所有动物都会飞,不能在抽象类中作为抽象方法实现
 * 实现了飞行接口就必须实现接口里面的方法,为什么不把fly方法直接放到FlyAnimal中呢,因为飞行只是一个接口行为,并不一定只有动物会飞,飞机也可以飞,气球也可以飞
 * 接口只是个规范行为,遵守了这个规范都可以实现里面的方法
 */
interface Fly
    void fly();


/**
 *  狗狗继承动物类,实现eat方法就好
 */
class Dog extends Animal
    void eat() 
        System.out.println("骨头");
    


class Cat extends Animal
    void eat() 
        System.out.println("吃鱼");
    


/**
 *  抽离出公共类飞行动物继承自动物,实现fly接口
 */
class FlyAnimal extends Animal implements Fly

    @Override
    void eat() 
        System.out.println("吃东西");
    

    @Override
    public void fly() 
        System.out.println("i can fly");
    


/**
 *  飞行类的动物就可以继承飞行动物类,重写eat fly方法
 */
class Bird extends FlyAnimal
    public void fly() 
        System.out.println("i can fly,i am bird");
    

    void eat() 
        System.out.println("吃虫子");
    


class Chicken extends FlyAnimal
    void eat() 
        System.out.println("玉米");
    

    public void fly() 
        System.out.println("i can fly, i am chicken");
    

 

  可以看到进行面向对象的思路的改进后代码量并没有减少,但是整体的层次就非常明显了。

  如果大多数程序都按照第一次那样来写,底层类的设计不合理维护起来非常麻烦,上层person类调用起来也是非常繁琐,底层增加一个类,person增加一个方法。

  在第二次的程序里,虽然在类的设计上代码量多了,但是把每个类的共性、方法都抽离出来,再进行维护起来关系层次很清晰,而修改类底层设计,person类根本不需要做改动。

 

  经过两次的代码比对应该能发现多态的好处了,也理解了多态在面向对象中发挥的作用。如果仅仅有个模糊的概念,在看一些源码的时候非常的吃力,因为一些源码运用了大量的设计模式及面向对象的思想,看一个方法会发现跳过来跳过去还不知道到底是做什么用的,只有将最基础的东西学明白学扎实了才能更好的进行程序设计。

面向对象的三大特性之多态(代码片段)

#面向对象的三大特性之多态#多态由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同#多态的概念指出了对象如何通过他们的属性和动作来操作及访问,而不需要考虑他们具体的类#多态表明了动态(运行时)绑定... 查看详情

java中面向对象三大特性之——多态(代码片段)

多态的概述: 多态是继封装、继承之后,面向对象的第三大特性。生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样的。可见,同一行为,通过不同的... 查看详情

面向对象三大特性(封装/继承/多态)(代码片段)

引入:在面向对象思想中,有三大特性,封装 继承 多态。思考:我们在使用类和对象实现编程的时候,到底是遵循这什么样的逻辑呢?为什么要这样规范类呢?引入:面向对象很重要的思想就是隐藏,即外部不知道类内... 查看详情

java面试题详解一:面向对象三大特性(代码片段)

一,多态:1.面向对象四大基本特性:抽象,封装,继承,多态抽象,封装,继承是多态的基础。多态是抽象,封装,继承的表现。2.什么是多态不同类的对象对同一消息作出不同的响应叫做多态3.多态的作用简单来说:解藕。详... 查看详情

面向对象三大特性之多态与多态性(代码片段)

一、多态‘‘‘多态:同一事物的多种形态‘‘‘#文件的多种形态:classFile:defclick(self):passclassTextFile(File):defread(self):print(‘文本文件双击可以查看内容‘)classExeFile(File):defexe(self):print(‘可执行文件双击可以执行‘)file1=TextFile()file2... 查看详情

面向对象三大特性:继承封装多态(代码片段)

继承:即子类可以继承父类的除了所有属性、方法外的所有内容。子类继承父类,只需要在类名后面加上(父类名)即可。如下定义一个父类,AnimalsclassAnimals:pass再定义一个子类cat,继承父类Animalsclasscat(Animals):pass这样cat类即可继... 查看详情

大数据必学java基础(四十一):面向对象三大特性之一多态(polymorphism)(代码片段)

文章目录面向对象三大特性之一多态(Polymorphism)一、案例代入二、向下转型,向上转型 三、简单工厂设计模式面向对象三大特性之一多态(Polymorphism)多态跟属性无关,多态指的是方法的多态,而不是属性的多态一、案... 查看详情

[c++]面向对象语言三大特性--多态(代码片段)

大家这篇文章描述的是我在学习多态时的一些学习笔记,和问题,还有一些面试题,希望这篇文章对你会有帮助文章目录什么是多态?如何才可以看到多态这一属性呢?(概念)什么虚函数?如何使用多态... 查看详情

面向对象三大特性之封装与多态(代码片段)

一、封装最主要的作用:隐藏对象的属性和实现细节,仅对外提供公共访问方式封装原则将不需要对外提供的内容都隐藏起来把属性都隐藏,提供公共方法对其访问在python中用双下划线开头的方式将属性隐藏起来(设置成私有的... 查看详情

java面向对象(oop)--面向对象三大特性之一:多态(多态方法绑定instanceof和类型转换(重写重载和多态的关系))(代码片段)

1.多态1.1认识多态多态性是OOP中的一个重要特性,主要是用来实现动态联编的,换句话说,就是程序的最终状态只有在执行过程中才被决定而非在编译期间就决定了。这对于大型系统来说能提高系统的灵活性和扩展性... 查看详情

面向对象三大特性(代码片段)

#面向对象三大特性#1.继承#2.封装#3.多态‘‘‘1.继承的定义:是一种新建类的方式,新建的类称为子类,子类会遗传父类的属性,可以减少代码冗余。在python中,子类(派生类)可以继承一个或者多个父类(基类,超类)‘‘‘... 查看详情

封装继承多态为面向对象的三大基石(代码片段)

封装、继承、多态为面向对象的三大基石(特性)。运行时的动态类型判定针对的是方法。运行程序访问的属性仍为编译时属性。Overloading针对的是编译时类型,不存在运行时的多态。 1packageTomText;2//使用方法计算3、6和9的阶... 查看详情

java面向对象之多态(代码片段)

...态的实现3.小结 1.多态的含义       多态,是Java面向对象的三大特性之一,使用之地特别广泛。那么什么是多态呢?多态是同一个行为具有多个不同表现形式或形态的能力。比如炒菜这个行为在不同厨师身上会产... 查看详情

java面向对象之多态(代码片段)

...态的实现3.小结 1.多态的含义       多态,是Java面向对象的三大特性之一,使用之地特别广泛。那么什么是多态呢?多态是同一个行为具有多个不同表现形式或形态的能力。比如炒菜这个行为在不同厨师身上会产... 查看详情

python入门-6面向对象编程:07面向对象三大特征(封装继承多态)-继承(代码片段)

一:面向对象三大特征介绍  Python是面向对象的语言,也支持面向对象编程的三大特性:继承、封装(隐藏)、多态。  封装(隐藏)    隐藏对象的属性和实现细节,只对外提供必要的方法。相当于将“细节封装... 查看详情

面向对象的三大特性(代码片段)

面向对象的三大特性是指:封装、继承和多态一、继承1.1、继承的定义继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类1.2、python中类的继承分为... 查看详情

三大特性:封装,继承,多态

透切理解面向对象三大基本特性是理解面向对象五大基本原则的基础.三大特性是:封装,继承,多态所谓封装: 也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信... 查看详情

[c++]面向对象语言的三大特性--继承(代码片段)

...面选对象语言的三大特性?这里先简单来说下什么是面向对象的三大特性封装继承多态封装把函数和变量全部整合在一起进行管理,保 查看详情