1、面向对象(OOP)

 

        面向对象是相较于面向过程而言的,面向对象一直都是一个很抽象的概念,也是面试官钟爱且常问的问题,理解抽象的东西最好的办法就是利用比喻,找个现实世界的例子去匹配这个概念,就会使得抽象的东西容易理解。

        记得一个大牛用过一个比喻:什么是面向对象?假如你想要一个房子住,面向对象就是你去开发商那直接买一个商品房,面向过程就是你自己找工人买建材自建一个房子。

        这个比喻一出来,我们其实对面向对象和面向过程就有种豁然开朗的感觉了,之前看很多教材都是很文绉绉很术语的形式在陈述,不是说不好,但是确实理解起来更费劲点。通过这个比喻,大家对于面向对象和面向过程的特点也有个大概的了解:

  • 面向对象:你只需要关注你的需求即可,不用关心沙子水泥怎么搅拌、砖怎么堆砌,这些都是开发商及建筑商搞定了,交钱就行,其他的都不用关心。对应于实际开发,面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节,需要什么功能直接使用就行了,不用一步一步去实现,至于这个功能怎么实现的,我们不用关心,反正能用会用就行了,等于站在巨人肩膀上;面向对象将以前的过程中的执行者,变成了指挥者。
  • 面向过程:你不但要关注需求,还需要关注具体的实现细节,你要自己找工人、买沙石、监工...,一步都不能落下,少一步你都没房子住,操碎了心,哎。对应于实际开发,面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。


说完以上,各自优缺点也就出来了:

面向对象:

1.将复杂的事情简单化(操心太多容易老);

2.松耦合、易维护(对象可以复用和替换,这个对象不满足,换一样对象就完了,so easy)

3.高扩展性(多态就是最好的说明)

4.安全性(封装特性把外部变化隔离,不至于一点变化导致整个代码崩掉,同时隐藏对象的属性和实现细节,仅对外提供公共访问方式,防止被篡改))

面向过程:

1.性能比面向对象好,因为类调用时需要实例化,开销比较大,比较消耗资源

2.万丈高楼平地起,面向对象再牛逼底层也是面向过程的算法或者逻辑来实现,面向对象这个指挥者没了面向过程这个群众基础,也是干吆喝。

两者的缺点就不分析了,可以理解为彼之长即此之短,两者相互依存,并不对立,不管是直接买商品房还是自建,都能满足你想要有房住的需求不是。

 

2、OOP的三个特征

  • 封装性:当内部操作不可直接使用时,将内部属性方法等私有化,内部操作对外部而言不可见,仅对外提供公共访问方式。

封装的好处是:将变化隔离,提高复用性和安全性。

  • 继承性:在已有的结构或功能的基础上继续扩充其他功能。

提高代码复用性(在以前有的属性和功能基础上扩展,不用重头来一遍);继承是多态的前提

  • 多态性:是在继承的基础上扩充而来的概念,指的是类型的转换处理。

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

 

3、OOP开发的三个步骤:

  • OOA:面向对象分析------OOA的实质就是建模,对客观存在的事物建立理论模型
  • OOD:面向对象设计------OOD实际上就是把分析阶段得到的需求抽象为系统实现方案的过程
  • OOP:面向对象编程------OOP即把设计好的系统通过代码编程实现

比如:你要建个网上商城,那就首先要把客观的业务需求转化为各个功能模块,用户、菜单(登录菜单、购物菜单、商品菜单、其他菜单)、商品管理员等,这个过程就是OOA;根据上面的理论模型制定实现方案,将模型映射为具体的对象,这个就是OOD过程;最后按照设计代码实现的过程就是OOP。

 

4、假如父类有main方法,子类能不能继承?父类的private 子类能否继承?

1、Sun的Java Tutorial中是这么说的:

A subclass inherits all the member variables and methods from its superclass.However, the subclass might not have access to an inherited member variable or method.For example, a subclass cannot access a private member inherited from its superclass.One might think,then,that the item was not inherited at all.But the item is inherited.This becomes important when using an inner class,which does have access to its enclosing class's private members.Note that constructors are not members and so are not inherited by subclasses.

也就是说子类可以继承父类所有的属性和方法,main方法也不例外,只是对于私有的不能访问。还有最后一句说构造函数不是类的成员,所以不会被子类继承。

2、父类里有private属性的变量,子类可以继承,不过不能使用,即能继承,但没有使用权,但是,我们可以通过set和get的方法来间接的访问父类中的private属性的变量。

5、多态的三个必要条件?

继承、重写、父类引用指向子类对象。