Java基础之面向对象

目录

什么是面向对象

什么是面向过程

面向过程和面向对象的区别

面向对象的三大特征

面向对象五大基本原则

单一职责原则

开放封闭原则

里氏替换原则

依赖倒置原则

ISP接口隔离原则

总结



什么是面向对象

  • 面向对象是一种思想,是基于面向过程而言,就是说面向对象是将功能等通过对象来实现的,将功能封装进对象中,让对象去实现具体的细节;这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是一种对数据的优化,操作起来方便,简化过程。

什么是面向过程

  • 自顶而下顺序执行,逐步求精;其程序结构是按功能划分为若干个基本模块,这些模块形成一个树状结构;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。程序流程在写程序时就已决定

面向过程和面向对象的区别

面向过程

优点 : 性能比面向对象号,因为类调用时需要实例化,开销比较大,比较消耗资源。

缺点 : 不易维护、不宜复用、不易扩展。

面向对象

优点 :易维护、易复用、易扩展,由于面向对象有封装、继承、多态,可以设计出低耦合的。

系统 :使系统更加灵活、更加易于维护。

缺点 :性能比面向过程差。

 

 

 

面向对象的三大特征

 

 

1.封装

封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

2.继承

继承是面向对象的基本特征之一,继承机制允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

继承概念的实现方式有三类:实现继承、接口继承和可视继承。

  •         实现继承是指使用基类的属性和方法而无需额外编码的能力;
  •         接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
  •          可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。

3.多态

父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的扩展性。

多态的优点:

  • 1. 消除类型之间的耦合关系
  • 2. 可替换性
  • 3. 可扩充性
  • 4. 接口性
  • 5. 灵活性
  • 6. 简化性

  多态存在的三个必要条件

  • 继承
  • 重写(子类继承父类后对父类方法进行重新定义)
  • 父类引用指向子类对象

实现多态,有二种方式,覆盖,重载。

覆盖,是指子类重新定义父类的虚函数的做法。

重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

其实,重载的概念并不属于“面向对象编程”,重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!真正和多态相关的是“覆盖”。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚邦定)。结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关!引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚邦定,它就不是多态。”

 简言之,多态其实是在继承的基础上的。比如说今天我们要去动物园参观动物,那么你说我们去参观兔子、参观绵羊、参观狮子、参观豹子都是对的,但你不能说我们去参观汽车。在这个例子中,子类具有多态性:除了使用自己的身份,还能充当父类。

 

面向对象五大基本原则

单一职责原则

  • 一个类应该仅有一个引起它变化的原因(最简单,最容易理解却不容易做到的一个设计原则)

开放封闭原则

  • 既开放又封闭,对扩展是开放的,对更改是封闭的。
  • 扩展及扩展现行的模块,当我们软件的实际应用发生改变时,出现新的需求,就需要我们对模块进行扩展,使其能够满足新的需求。

更改封闭即是在我们对模块进行扩展时,请勿对源代码和DLL进行修改或者重新编译文件。

这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术。

里氏替换原则

  • 子类可以替换父类并且出现在父类能够出现的任何地方
  • 这个原则也是在贯彻GOF倡导的面向接口编程。

在这个原则中父类应尽可能使用接口或者抽象类来实现。

就是子类通过实现父类接口,能够替换父类使用的地方。

通过这个原则,我们客户端在使用父类接口的时候,通过子类实现。

意思是说我们一来父类接口,在客户端申明一个父类接口,通过子类来实现。

依赖倒置原则

  • 传统的构造化编程中,最上层的模块通常都要依赖下面的子模块来实现,也成为了高层依赖底层。

所以DIP原则就是要逆转这种依赖关系,让高层模块不要依赖底层模块,所称为依赖倒置原则。

ISP接口隔离原则

  • 这个原则的意思是:使用多个专门的接口比使用单个接口要好的多。

 

总结

  • 抽象会使复杂的问题更加简单化。
  • 从以前面向过程的执行者,变成了张张嘴的指挥者。
  • 面向对象更符合人类的思维,面向过程则是机器的思想
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值