什么是面向对象编程思想?

2019-07-3114:19:18编程语言入门到精通Comments4,387 views字数 4970阅读模式

作者:力扣(LeetCode)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

一、面向对象是什么

面向对象 (Object Oriented,OO) 的思想对软件开发相当重要,它的概念和应用甚至已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD 技术、人工智能等领域。面向对象是一种 对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

面向过程 (Procedure Oriented) 是一种 以过程为中心 的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是 封装继承文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

无论是在软件开发还是在实际工作中,深入地理解软件开发的思想都非常有必要。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

二、从一场比赛说起

在一个软件村里文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

有一名资深「面向过程」程序员——老过文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

和一名「面向对象」信徒——阿对文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

同时受雇于一家挨踢店文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

有一天老板突发奇想文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

决定让这两名程序员进行一次比赛文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

获胜者将获得一个限量的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

360 度全自动按摩椅文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

编程比赛开始了文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

什么是面向对象编程思想?

不一会,他俩都写出了几乎相同的代码文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

class Bill{

// 获取总价
fun getPrice(): Double {
val unit = getUnit()
val number = getNumber()
val price = unit * number
return price
    }

// 获取单价
fun getUnit(): Double {
        ...
    }

// 获取数量
fun getNumber(): Int {
        ...
    }
}
什么是面向对象编程思想?

老过看到新需求,微微一笑文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

class Bill{

    fun getPrice(): Double {
        val unit = getUnit()
        val number = getNumber()
        val price = unit * number
        if (todayIsLoversDay()) {
            return price * 0.77
        }
        return price
    }

    fun getUnit(): Double {
        ...
    }

    fun getNumber(): Int {
        ...
    }

    fun todayIsLoversDay(): Boolean {
        ...
    }
}
什么是面向对象编程思想?

​他决定让新的收银方式继承 Bill 类文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

先在 Bill 类中新增 discount 方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

并将其开放文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

open class Bill{

    fun getPrice(): Double {
        val unit = getUnit()
        val number = getNumber()
        val price = unit * number
        return discount(price)
    }

    // 处理打折优惠
    open fun discount(price: Double): Double{
        return price
    }

    fun getUnit(): Double {
        ...
    }

    fun getNumber(): Int {
        ...
    }

}

普通的收费方式在 discount文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

​函数中直接返回价格文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

七夕节的收费方式则继承此类文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

在 discount 函数中实现打 77折文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

class LoversDayBill : Bill(){
    override fun discount(price: Double): Double {
        return price * 0.77
    }
}

当老过和阿对同时将程序交给老板时文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

什么是面向对象编程思想?

老过已经开始幻想自己将来文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

坐在按摩椅上的舒服日子文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

什么是面向对象编程思想?

听到新需求文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

老过一阵头大文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

不由在群里吐槽文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

什么是面向对象编程思想?

吐槽归吐槽文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

老过在 getPrice 函数中文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

再次增加了条件判断文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

class Bill {

    fun getPrice(): Double {
        val unit = getUnit()
        val number = getNumber()
        val price = unit * number
        if (todayIsLoversDay()) {
            return price * 0.77
        }
        if (todayIsMiddleAutumn() && price > 399) {
            return price - 200
        }
        if (todayIsNationalDay() && price < 100) {
            // 生成 0 ~ 9 随机数字,如果为 0 则免单。即:十分之一概率免单
            val free = Random().nextInt(10)
            if (free == 0) {
                return 0.0
            }
        }
        return price
    }

    fun getUnit(): Double {
        ...
    }

    fun getNumber(): Int {
        ...
    }

    fun todayIsLoversDay(): Boolean {
        ...
    }

    fun todayIsMiddleAutumn(): Boolean {
        ...
    }
    
    fun todayIsNationalDay(): Boolean {
        ...
    }
}

看着越来越复杂的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

Bill 类和 getPrice 方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

老过眉头紧锁文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

他深知事情远没有结束文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

中秋和国庆一过文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

他还需要到这个复杂的类中文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

删掉打折的方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

天知道老板还会再提文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

什么天马行空的需求文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

无论是新增或删除代码,在这个过长的类里做修改都是件不太愉快的事。为了在一个很长的函数中找到需要修改的位置,「面向过程」使得老过不得不浏览大量与修改无关的代码,小心翼翼地修改后,又要反复确认不会影响到类的其他部分。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

老过在心底里默默地祈祷文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

这个类不再需要修改文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

提交了自己的程序文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

阿对收到新需求时文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

先是新增了中秋节支付类文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

class MiddleAutumePrice : Bill() {
    override fun discount(price: Double): Double {
        if (price > 399) {
            return price - 200
        }
        return super.discount(price)
    }
}

再增加了国庆节支付类:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

class NationalDayBill : Bill() {
    override fun discount(price: Double): Double {
        if (price < 100) {
            // 生成 0 ~ 9 随机数字,如果为 0 则免单。即:十分之一概率免单
            val free = Random().nextInt(10)
            if (free == 0) {
                return 0.0
            }
        }
        return super.discount(price)
    }
}

「面向对象」让阿对最喜欢的一点是文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

什么是面向对象编程思想?

有一个好消息要告诉大家!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

当老板兴高采烈地说出这句话时文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

老过和阿对都露出了心惊胆战的表情文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

这句话往往意味着要更改需求文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

什么是面向对象编程思想?

老过反抗道文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

但他并没有说出心里另一个小九九文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

实在不想再去给 Bill 类添加代码了文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

什么是面向对象编程思想?

这次修改老过花了较长的时间才完成文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

class Bill {
    val gifts = listOf("flower", "chocolate", "9.9 discount")

    fun getPrice(): Double {
        val unit = getUnit()
        val number = getNumber()
        val price = unit * number
        if (todayIsLoversDay() && isCouple()) {
            if (price > 99) {
                val lucky = Random().nextInt(gifts.size)
                println("Congratulations on getting ${gifts[lucky]}!")
            }
            return price * 0.77
        }
        if (todayIsMiddleAutumn() && price > 399) {
            return price - 200
        }
        if (todayIsNationalDay() && price < 100) {
            // 生成 0 ~ 9 随机数字,如果为 0 则免单。即:十分之一概率免单
            val free = Random().nextInt(10)
            if (free == 0) {
                return 0.0
            }
        }
        return price
    }
    
    fun getUnit(): Double {
        ...
    }

    fun getNumber(): Int {
        ...
    }

    fun todayIsLoversDay(): Boolean {
        ...
    }

    private fun isCouple(): Boolean {
        ...
    }

    fun todayIsMiddleAutumn(): Boolean {
        ...
    }

    fun todayIsNationalDay(): Boolean {
        ...
    }
}

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

看着那个只属于七夕节的 gifts 变量文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

老过像看着自己白衬衫上的油渍一样难受文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

以后每次收费时都会生成一个文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

只有七夕节才会用到的变量文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

都是因为老板的需求太奇葩文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

才让这个程序看起来乱糟糟的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

由于这个类做了修改文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

本来已经测试通过的代码又得重测一遍文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

阿对打开了 LoversDayBill 类文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

将其修改如下文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

class LoversDayBill : Bill() {
    
    val gifts = listOf("flower", "chocolate", "9.9 discount")
    
    override fun discount(price: Double): Double {
        if (!isCouple()) return price
        if (price > 99) {
            val lucky = Random().nextInt(gifts.size)
            println("Congratulations on getting ${gifts[lucky]}!")
        }
        return price * 0.77
    }

    fun isCouple(): Boolean {
        ...
    }
}
什么是面向对象编程思想?

当老板看完老过和阿对的代码后文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

再次兴奋地提出新需求时文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

老过顿时晕了过去......文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

比赛真是太焦灼了文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

最后赢得奖励的是?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

第三个参赛者文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

老板的傻儿子文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

他完全不会写程序文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

但他使用 Ctrl+C,Ctrl+V 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

拷贝了阿对的代码文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

三、面试常见考点

在面试中,面向对象的常见考察点是三个基本特征:封装、继承、多态。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

  • 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
  • 继承 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来类的情况下对这些功能进行扩展。通过继承创建的新类称为「子类」或「派生类」,被继承的类称为「基类」、「父类」或「超类」。 要实现继承,可以通过 继承和组合 来实现。
  • 多态性 多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单说就是一句话:允许将子类类型的指针赋值给父类类型的指针。 实现多态,有两种方式,覆盖和重载。两者的区别在于:覆盖在运行时决定重载是在编译时决定并且覆盖和重载的机制不同。例如在 Java 中,重载方法的签名必须不同于原先方法的,但对于覆盖签名必须相同。

我对面向对象的理解:面向对象的编程方式使得每一个类都只做一件事面向过程会让一个类越来越全能,就像一个管家一样做了所有的事。而面向对象像是雇佣了一群职员,每个人做一件小事,各司其职,最终合作共赢!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

四、引申阅读

最后,我们谈谈面向对象有什么好处?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

《大话设计模式》中大鸟给小菜讲的故事非常经典:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

“话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,曹操大悦,于是大宴众文武,在酒席间,曹操诗性大发,不觉吟道:‘喝酒唱歌,人生真爽……’众文武齐呼:‘丞相好诗!’于是一臣子速命印刷工匠刻版印刷,以便流传天下。”文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

“样张出来给曹操一看,曹操感觉不妥,说道:‘喝与唱,此话过俗,应改为‘对酒当歌’较好!’于是此臣就命工匠重新来过。工匠眼看连夜刻版之工,彻底白费,心中叫苦不迭。只得照办。”文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

“样张再次出来请曹操过目,曹操细细一品,觉得还是不好,说:‘人生真爽‘太过直接,应改问语才够意境,因此应改为‘对酒当歌,人生几何……’当臣子转告工匠之时,工匠晕倒……”文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

大鸟:“小菜你说,这里面问题出在哪里?”文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

小菜:“是不是因为三国时期活字印刷还未发明,所以要改字的时候,就必须要整个刻板全部重新刻。”文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

大鸟:“说得好!如果是有了活字印刷,则只需更改四个字就可,其余工作都未白做。岂不妙哉。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

一、要改,只需更改要改之字,此为可维护文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

二、这些字并非用完这次就无用,完全可以在后来的印刷中重复使用,此乃可复用文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

三、此诗若要加字,只需另刻字加入即可,这是可扩展文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

四、字的排列其实可能是竖排可能是横排,此时只需将活字移动就可做到满足排列需求,此是灵活性好。”文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

“而在活字印刷术出现之前,上面的四种特性都无法满足,要修改,必须重刻,要加字,必须重刻,要重新排列,必须重刻,印完这本书后,此版已无任何可再利用价值。”文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

小菜:“是的,小时候我一直奇怪,为何火药、指南针、造纸术都是从无到有,从未知到发现的伟大发明,而活字印刷仅仅是从刻版印刷到活字印刷的一次技术上的进步,为何不是评印刷术为四大发明之一呢?原来活字印刷是思想的成功,面向对象的胜利。”文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/14807.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/14807.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定