zoukankan      html  css  js  c++  java
  • 深入浅出面向对象

    前些日子我们引入编程思想,无论哪种语言,核心思想就是万物皆对象。可能初学时我们对其不甚了解,但是逐渐深入后就会深谙其道。

    面向对象通俗讲就跟你对象在你面前是一样的,你不用管她是谁家的孩子,不管她是哪里人,不在乎她穿的啥身材咋样,只要你是你想要的,上去盘她就对了。

    面向对象就是不去管内部细节是如何现实的,你只管用就行了,如下图:

    由上图引入面向对象的三大特征:封装,继承,多态。

    先说一下封装,面向对象的思想主要是以对象为主,将一个问题抽象出具体的对象,并且将抽象出来的对象和对象的属性和方法封装成一个类。不同的语言封装类的方法不同,但最终就是让人去用它,而不是每次需要的时候再去自己创建。如下代码。

    上面使用Python写的一个简单的类,因为Python语言十分接近中国人语法习惯,代码简洁易懂,其他的我也不懂,小白一个。

    在上面定义了一个 Cat 的 class 类,我们知道 cat 有 color 属性和 eat() 方法,所以我们将其封装成一个 class 类,在用到的时候直接创建一个对象,然后就可以用 Cat 类里面的属性和方法了,而不必每次用的时候每次创建,这样就减少了代码的重复性,易于维护。

    面向对象中继承在不同语言中同样有不同的继承方法,在 JavaScript 中有如下继承方法。

    在这之前本人讲过原型及原型链,其中 prototype 就是原型式继承,有时间的话再单独学习一下所有的 JavaScript 的继承方式再和大家分享一下。我们再援引上面 Python 所写的程序详解一下继承,代码如下:

    我们之前定义过一个 Cat 的 class 类,但是不只是 Cat 会吃, Dog,Bird 等动物都会叫,所以我们可以定义一个 Animal 的 class 类,在定义 Cat 类的时候只需要继承 Animal 的类,当创建一个 cat 实例的时候,我们并没有在 Cat 的 class 类中定义 eat() 方法,但当调用 eat() 方法时,可以去 Animal 的 class 类中调用 eat() 方法,这就是继承。

    在说完封装和继承后,我们再着重说一下多态这个概念,在这之前我们先说一下强类型和弱类型语言,像 Java 和 C++ 这种在定义参数的时候需要先定义参数的类型,如 String 或者 int ,这种称之为强类型语言,像 JavaScript 和 Python 这种在定义参数的时候直接定义,不需要定义参数类型的叫弱类型语言。

    多态,顾名思义,即为多种形态,如下 Python 代码:

    我们分别定义了 Animal 和 Cat 两个类,其中 Cat 类继承了 Animal 类。他们都有相同的一个行为 eat(),当我们实例化两个 class 类,调用 action() 方法,当传入的对象不一样时,所发生的行为不一样,这就是多态。多态是在调用的那一刹那才知道究竟要发生什么样的行为。

    多态无论在强类型语言还是在弱类型语言中均有体现,但是在强类型语言当中尤为突出。如下 Java 代码:

     

    我们定义了一个 Animal 的 class 类,然后让 Cat 类继承了 Animal 类,两个 class 类里面都有 eat() 的方法,但是传递的参数不一样, Animal 类只需要传入一个 String 类型的参数,而 Cat 类需要传输一个 int 类型和 String 类型的参数,当我们创建了一个 Cat 实例时,调用 eat() 方法,传入的参数不同,得到的结果就不同,这就是 Java 的一种多态,也叫重载。

    Java 中还提供了一种多态机制,即重写,也叫覆写。当然其他语言当中也有重写这个概念。重写就好理解很多了,当子类与父类中拥有相同的方法,传入的参数也完全相同时,当实例化子类型调用共同拥有的方法,如 eat() 方法时,子类型的方法就会覆盖父类型的方法,如下代码:

    当实例化 Cat 对象时,虽然父类中有 eat() 方法,但由于子类中重新定义了 eat() 方法,所以会调用子类的 eat() 方法。

    重载和重写可以使代码实现更加灵活,当觉得父类提供的方法不合适时自己可以根据实际需求量身定做。

    以上就是本人对面相对象的三个特征的理解,有不对之处请帮忙指正。

    说完面相对象的编程思想,就不得不提另一种编程思想:面向过程。像 C 语言就是一种典型的面向过程的编程语言,Java 是一种典型的面向对象的编程语言,Python 是一种典型的既能面向过程又能面向对象的编程语言。

    这里我们简单说一下两者,我们举一个经典的冰箱和大象的故事来区分一下面向过程和面向对象。

    可以看出来面向对象和面向过程的侧重点是不同的,面向过程是以动词为主,完成一个事件就是将不同的动作函数按顺序调用。面向对象是以主谓为主,即定义冰箱的类,将大象这个参数传进去即可,不必考虑冰箱是怎么操作的。

    面向对象和面向过程均有其优劣点,不能武断究竟谁优谁劣,应根据实际情况进行开发。优劣点本人文化程度低,总结不出来,就搜了一下

  • 相关阅读:
    判断activity是否显示在界面上
    限制EditText的输入字数
    安卓自定义类似TabHost的导航栏
    安卓中加载布局文件的三种方法
    绘图——Android绘图基础:Canvas、Paint等
    使用简单图片
    使用原始资源
    MySQL分表(Partition)学习研究报告
    Docker基础知识介绍
    Python开发系列
  • 原文地址:https://www.cnblogs.com/weijiutao/p/10608276.html
Copyright © 2011-2022 走看看