谈谈面向对象的基本特征

这是在面试里最基本最简单的问题,你可以简单的回答抽象、封装、继承和多态。但就是这个简单的问题会难倒很多人,因为面试人可从答案里看出你的逻辑能力和编程素养。这段时间在忙总结忙准备面试,每次看到类似的这种问题我都会重新回想一遍答案。

4个基本特征依次是抽象、封装、继承、多态。我想要强调的是它们是层层递进的关系。

首先,抽象是面向对象编程的基础。在日常生活中,抽象多数情况下是一个形容词。你可以说,某某人长的很抽象。这个人也许是很普通的一个人,但是他的某个部位会很突出,作为他的一个个人特征让人很容易记得住他。而在编程过程中,抽象是一个动词。程序员要做的是提取现实世界中某个事物的“共性”和特征,然后使用计算机语言描述概括。

protected class Human{
  int hight;
  int weight;
  void run(){}
}

上面的代码只是抽象的一个简单结果。在设计的时候什么是需要的什么是可忽略的就根据实际情况去。这么说下去有点废话了。

那接下来就是封装。封装是类的特性之一。在上面的例子中,一个human类封装了2个属性和1个方法。简单来说,封装就是将信息隐藏,实现“高内聚,低耦合”的编程目的。同时,封装也可以说是在程序员抽象过程后,对代码进行打包处理的一个“必要手续”。

另外,这里面还涉及到访问控制的一个概念。信息打包好之后,谁能用,谁能打开,甚至要对谁隐藏。就要求人们设置访问权限。在java里,访问控制的4个关键词是:public,protected,frendly,private。它们的访问控制范围是从大到小排列的。

public class Chinese extends Human{

  String speakC(){}

}

在上面的代码中,Chinese 是 Human的一个子类。Chinese除了有speakC这方法外,他其实还有身高体重的属性。这是继承的一个特性。继承的设计是为了代码重用减少开发,方便扩展功能。在不考虑访问控制和static、final关键字的情况下,子类完全拥有父类的属性和方法。要注意的是,在java上,子类只能继承自一个父类。不过,在刚开始接触继承这概念的时候,相信很多人会跟我一样,把注意力放在“继承”两个字上。但你可以用字典查查extend这字的翻译,有“扩展”的意思。而扩展,才应该是我们在使用继承特性要关注的功能。

在一些教材上,对多态的解释是:指允许不同类的对象对同一消息作出响应。多态性语言具有灵活、抽象、行为共享、代码共享的优势。如果要我去描述多态这个特性,我更喜欢用另外一个词:动态绑定。首先,这个特性是建立在继承的基础上的。第二,多态这个特性产生功效的位置是带参方法的调用上。在一个方法或者构造方法上需要传入一个参数B,然后在方法内部,我调用B类去完成一些工作。在设计好之后,我又在代码的另外一个位置使用到了该方法。这时候,我可能会把B的一个子类B1或者B2,作为该方法的参数传入。那么这时候,编译器是不会报错的。这里涉及到oop的一个设计原--里氏代换原则,一个可以接受基类对象的地方必然可以接受一个子类对象。可是问题还没完,最后是B1还是B在工作呢?

这就是多态的灵活性体现。但多态机制的适用范围还不止这个,看看下面代码:

abstract class Graph{
     abstract void draw();
     Graph(){
      System.out.println(“before draw”);
      draw();
      System.out.println(“after draw”);
     }
}

class Round extends Graph{
        int radius = 1;
        Round(int r){
           radius = r;
           System.out.println(“create Round,radius=” + radius);
        }
        void draw(){
          System.out.println(“Round.draw(),radius=” + radius);
        }
}        

 

输出的结果是:

before draw
Round.draw(),radius=0
after draw
create Round,radius=5

在初始化Round对象前,必须初始化Graph类,但这时候程序走到draw()方法这行时,得益于多态机制,程序指向了还没有初始化的Round类的对draw方法的实现。这个小程序一方面体现了多态的灵活性,也反映出我们在使用多态时要更加小心。例如上面,尽管程序能“正确”执行,但因为类的初始化循序,得出的并不是我想要的结果。


以上是两星期前的文字,一直想增改部分内容。可是打开之后两眼发直的看着屏幕无从下手,总感觉写的很啰嗦肤浅达不到G点。不过现在想来,这只是为了应付面试准备的工作,而到时候面试官不会给你这么多时间。其实只要记住几个概念的关系,从里到外由浅及深地分析讲述,再适时地抛出几个关键字,能用代码就尽量写一段简短的代码来辅助描述,对付一般的HR是没问题了(做技术的肯定不会问这么无聊的问题:P )。

posted @ 2013-01-28 21:06  wisp pong  阅读(145)  评论(0)    收藏  举报