面向对象编程 OOP

  1.面向对象编程 OOP

        OOP:Object Oriented Programming,即面向对象编程。了解面向对象编程之前,需要了解下面向过程编程。现在有一个实际问题需要编程解决,把大象装冰箱里分几步?如果用面向过程的语言去实现则思路如下:

void main(){
    //1.打开冰箱门    
    openSomething(Refrigerator refrigerator){
    }
    //2.把大象装入冰箱
    putSomethingToRefrigerator(Elephant elephant){
    }
    //3.关上冰箱门
    closeSomething(Refrigerator refrigerator){
    }
}

        "打开冰箱门"这一个动作,冰箱门被作为操作对象的参数传入方法内,方法内定义打开冰箱门具体的实现。而如果用面向对象的思想去解决这件事的话则思路如下:

public class Refrigerator{
    openDoor(){      
    }
    putSomething(Elephant elephant){  
    }
    closeDoor(){ 
    }
}
public static void main(String[] args){
    Refrigerator refrigerator = new Refrigerator();
    //1.打开冰箱门
    refrigerator.openDoor();
    //2.将大象装入冰箱
    refrigerator.putSomething(new Elephant());
    //3.关上冰箱门
    refrigerator.closeDoor();
}

        可以看到在面向对象的世界里,一切以对象为核心,同样把大象装进冰箱里这个问题,我们的编程思路是先抽象出冰箱这样一个对象,然后抽象冰箱的静态属性和动态行为, 属性可以包括冰箱颜色、尺寸、耗电量等;动态行为包括开冰箱门,往冰箱门里放东西,关冰箱门等。

        面向过程的编程思路更加偏向于机器的思想,强调如何流程化的解决问题。而面向对象的思维强调以高内聚、低耦合的方式解决问题,先抽象事物模型,再解决实际问题。

2.面向对象的四大特性

        2.1 抽象

        何为抽象?如果清晰、直观、易于理解被称作"具体",那么反过来则是"抽象"。举个例子:汇编语言就是对机器语言的一种初步抽象。C、C++等语言又是对汇编语言的抽象。面向对象语言则是高度抽象的高级语言。再比如:从化合物到食物,从食物到水果,都属于抽象的层面。Java中的Object类是所有类的默认父类,是对万事万物的抽象,是在哲学方向上进行的延伸思考,高度概括了事物的自然行为和社会行为。哲学中的经典三大问题在Object类中都可以得到隐约的解答:

      (1)我是谁?getClass()说明本质上是谁,而toString()则是当前类的名片

      (2)我从哪里来?Object()构造方法是生产对象最基本的方式,而clone()则是生产对象的另外一种方式

      (3)我要到哪里去?finalize()则是对象在被销毁的时候触发的方法

        另外Object还映射了社会科学领域的一些问题:

      (1)世界是否因你而不同?hashCode()和equals()就是判断与其他元素是否相同的一组方法

      (2)如何与他人协作?wait()和notify()是对象间通信与协作的一组方法

        抽象是面向对象思想中最基础的能力之一,正确而严谨的业务抽象能力是后续封装、继承、多态的基石。

        2.2 封装

        封装是在抽象的基础上决定某些信息是否公开,以及公开的访问等级,概括的说就是以什么样的方式暴露哪些信息。举个例子:在上述把大象装进冰箱的例子里,当我们要执行把大象放进冰箱的步骤时,我们只需要new一个冰箱的对象,然后执行其putSomething()的方法,而无需了解具体冰箱是如何把大象装进去的,也就是说封装了外部不需要感知的复杂处理逻辑。封装使对象之间的关系变得简单,耦合度变弱,利于维护。

        2.3 继承

        继承是面向对象编程技术的基石,允许创建具有逻辑等级结构的类体系。继承是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。继承把枯燥的代码世界变得更有扩展性,为多态打下语法基础。但需要慎用继承,滥用继承会产生方法污染和方法爆炸。方法污染指的是父类具有的行为通过继承传给子类,但子类并不具有执行此行为的能力,比如鸟会飞,鸵鸟继承鸟,发现飞不了。方法爆炸指的是继承树不断扩大,底层类拥有的方法虽然都能执行,但其中部分方法并非与当前类的功能定位有关,由于基类方法众多且名称相似,造成编程时选错方法,导致线上异常。综上所属,提倡以组合优先的原则来扩展继承类的人类,即优先采用组合或聚合的类关系来复用其他类的能力,而不是继承。

        2.4 多态

        多态是以上述三个面向对象特性为基础,根据运行时的实际对象类型,同一个方法产生不同的运行结果,使得同一个行为具有不同的表现形式。多态是指在编译层面无法确定最终调用的方法体,以覆写为基础来实现面向对象的特性,具体为在运行期由JVM进行动态绑定,调用合适的覆写方法体来执行。举个例子:足球烯和石墨烯互为同素异形体,但他们都为碳元素的不同表现形式。

文中部分内容摘自《码出高效 Java开发手册》

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值