A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


关于对面向对象的理解

在我们刚开始接触java语言的时候,老师都会告诉大家什么是面向对象,只不过那个时候只是简单的对面向对象有一个大概的了解为我们之后的学习铺路,可是随着我们代码量的积累我应该对面相对象有一个更高层次的理解。多年从事教育工作在和老学员的聊天中发现大概是一个互联网公司都是有可能问道这个问题,大体上学员们也都可以回答的出这个问题,但是绝大多数的人回答的只是寥寥数语,这并不能给面试官眼前一亮的感觉。那么我们应该如何回答这个看似简答的问题呢,

从而提高我们的面试通过率呢?

之前有个玩笑,面试官问什么是面向对象,有个人略带沉思状,45度角望着天空,然后缓缓的说到,万物皆对象。这样的回答其实不能说是错误的,但是如果没有铺垫和延伸,这么说给人的印象就会十分不好了。

面向对象是基于万物皆对象这个哲学观点. 把一个对象抽象成类,具体上就是把一个对象的静态特征和动态特征抽象成属性和方法,也就是把一类事物的算法和数据结构封装在一个类之中,程序就是多个对象和互相之间的通信组成的.

上面的话是一个引言,也是对面向对象最好的概括,而且里面包含了很多知识点比如类和对象的关系,属性和方法的概括,并且底层调用方法时的通信原理。如果你这么说那么面试官一定会眼前一亮,想接着听你说下去,作为一个经验老道的程序员一定会从你的话中体会到你是一个对于计算机底层有一定了解,并且有丰富的理论知识。是一个经过系统学习并有一定经验的程序员。当我们成功的调起了面试官的兴趣,那么接下来就应该是分步的有调理的进入更深一步的探讨。

面向对象的三大特征 继承,封装,多态。

一 继承

继承概念:一个类继承另一个类,则称继承的类为子类,被继承的类为父类。

目的:实现代码的复用。

理解:子类与父类的关系并不是日常生活中的父子关系,子类与父类而是一种特殊化与一般化的关系,是is-a的关系,子类是父类更加详细的分类。如 class dog 继承于 animal,就可以理解为dog is a animal.注意设计继承的时候.

结果:继承后子类自动拥有了父类的属性和方法,子类可以写自己特有的属性和方法,目的是实现功能的扩展,子类也可以复写父类的方法即方法的重写。

二 封装

概念:封装也称为信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他部分只有通过包裹在数据外面的被授权的操作来与这个抽象数据类型交流与交互。也就是说,用户无需知道对象内部方法的实现细节,但可以根据对象提供的外部接口(对象名和参数)访问该对象。

好处:(1)实现了专业的分工。将能实现某一特定功能的代码封装成一个独立的实体后,各程序员可以在需要的时候调用,从而实现了专业的分工。(2)隐藏信 息,实现细节。通过控制访问权限可以将可以将不想让客户端程序员看到的信息隐藏起来,如某客户的银行的密码需要保密,只能对该客户开发权限。

三、多态

概念:相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。

理解:子类以父类的身份出现,但做事情时还是以自己的方法实现。子类以父类的身份出现需要向上转型,其中向上转型是由JVM自动实现的, 是安全的,但向下转型(downcast)是不安全的,需要强制转换。子类以父类的身份出现时自己特有的属性和方法将不能使用。

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

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

可以拿生活中的实例来理解面向过程与面向对象,例如五子棋,面向过程的设计思路就是首先分析问题的步骤:

1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤 2,9、输出最后结果。把上面每个步骤用不同的方法来实现。

如果是面向对象的设计思想来解决问题。面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对 象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

如果我们按照以上的回答具体的分步的来阐述面向对象,给面试官来印象就会非常好了,因为第一,你的回答十分有调理,面试官会最大限度的来接收你给出的信息。他会觉得你的思维什么严谨。理论功底什么扎实。其次在回答问题中联系了之前的开发项目,用具体的案例来解释。这样一个简单的问题,你深入的去说,步步深入。并且联系你之前的开发经验,在探讨这个问题的过程中有可能会引出其他更加底层的代码或者原理。面试官可能会让你谈谈你在写项目的过程中是如何通过封装提高安全性的。或者通过多态提高项目的扩展性的。这些突如其来的问题如果好好准备,那么我们就会把面试官要问的问题导向一个我们有所准备可控的范围内,最后如果能将面试官引向我们准备的几个设计模式的案例中。这样就会使接下来的面试更加轻松。


3 个回复

正序浏览
感谢老师分享
回复 使用道具 举报
占楼!!!
回复 使用道具 举报
我来占层楼啊   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马