面试官提问:什么是面向对象? 谈谈你对面向对象的理解
面试题拆解:
这道面试题对于工作时间不是很长的Java程序员来说,出现频率是比较高的。
那么到底什么是面向对象呢?讲面向对象之前,需要先普及聊一下面向过程,并聊聊两者的区别。
再从面向对象的角度出发,聊聊面向对象的三大特性:封装、继承、多态。
下面是面试君对于这个面试题的回答,不一定全对,可具有一定的参考借鉴意义:
面试官你好,我来回答一下这个问题,对于什么是面向对象,它是一种编程思想。聊到面向对象,我们需要聊一下面向过程的编程方式,因为面向对象是从面向过程过渡而来的。
以实际生活的案例来举一个例子,比如说洗衣服。
如果是面向过程的话,我们会将这个洗衣服任务拆解成一系列的步骤,每一个步骤就是一个函数。
第一步,打开洗衣机;
第二步,放衣服和洗衣液;
第三步,选择洗衣模式,开始洗衣;
第四步,等待洗完,拿出衣服。
如果是面向对象的编程方式,我们会拆分成人和洗衣机两个对象,再分析每一个对象,它需要做哪些事情。
人在其中需要做这三件事,第一件打开洗衣机,第二件是放衣服和洗衣液,第三件事是洗完衣服后拿出衣服。
洗衣机在其中只需要做一件事情,根据洗衣模式洗衣服。
在这个例子中,我们能够看出来面向过程跟面向对象,是两种不同的思维方式,处理问题的思考的角度不一样。
面相过程的思维方式,它更加注重这个事情的每一个步骤以及顺序。他比较直接高效,需要做什么可以直接开始干。
面向对象的思维方式,它更加注重事情有哪些参与者,需求里面有哪些对象,这些对象各自需要做些什么事情。将其拆解成一个个模块和对象,这样会更易于维护和拓展。
这个是面向过程跟面向对象的区别。
面向对象的三大特性:封装、继承和多态。
面向对象的第一大特性:封装
什么是封装呢?
通过访问修饰符(如 private)来修饰成员变量和成员方法,将不需要对外提供的内容都隐藏起来,提供公共方法对其访问。
封装的好处是:
- 隐藏实现细节,提供公共的访问方式
- 提高了代码的复用性
- 提高安全性
封装的意义在于,将内部的实现细节隐藏起来,对外部的调用者来说是透明的,调用者也不用关心它内部是怎么实现的,只需要知道这个方法是干什么的就好。
面向对象的第二大特性:继承
什么是继承呢?
在 Java 中子类使用关键词 extend 去继承父类的关系。
继承主要用途是将子类存在共性的东西,把它抽取出来放到父类里面,比如将共同拥有的属性和方法抽取出来放到父类里面。
这样的好处是,想要使用这些属性和方法的时候,可以直接去使用父类的,而不需要自己再重新去定义,更大程度的实现代码复用。
我们不需要写很多的冗余的代码,把共性的全部抽到父类,可以直接调用,如果需要个性化自定义子类的方法时,去重写父类的方法即可。
面向对象的第三大特性:多态
什么是多态呢?
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作
怎么理解?
多态是和继承一脉相承的,多态存在的需要有三个必要条件:继承、重写、父类引用指向子类对象。
用个案例补充解释一下:
比如说打印机,它属于一个父类,有一台彩色打印机,属于子类,有一台黑白打印机,也属于子类。关系如下图所示。
用这个案例来解释一下多态,以及多态存在的三个必要条件:
1、继承,彩色打印机和黑白打印机都继承自打印机这个父类;
2、重写,打印机有一个打印的方法,彩色打印机和黑白打印机会重写父类的打印的方法,效果就是,彩色打印机打印出来的效果是彩色,而黑白打印机打印出来的效果是黑白的。
3、父类引用指向子类对象,例如:Parent p = new Child() ;对应到打印机的案例,new 一个对象的时候,父类打印机的引用会指向具体的对象,彩色打印机或者黑白打印机。
多态的好处:
便于接口的维护和拓展,可以将某一个子类切换成其他的子类,代码不需要做任何的改变,具有可替换性。
多态的弊端:
只有是子类重写的父类的方法,父类才可以调用,但如果子类的方法不是重写父类的,而是子类独有的,那么这个时候多态就使用不了,这个是需要注意的点。
以上就是我对这个问题的回答,什么是面向对象,以及我对面向对象的理解,不知道我是否有讲清楚吗? 如果有哪里没讲清楚的地方,我可以再补充解释。
最后的话:
这是在Java中一道很经典的一个面试题,什么是面向对象,那么谈谈你对面相对象的理解。
需要掌握面向过程和面向对象的区别,这样就理解了什么是面向对象。
另外需要掌握面向对象的三大特性:封装、继承、多态,并聊聊分别是什么意思和主要用途。
掌握这些知识的话,那么针对这个题目,相信可以做出一个让面试官相当满意的回答。