设计模式学习(一):java 面向对象特征:抽象、封装、多态、继承

java 面向对象特征: 抽象、封装、多态、继承


一、抽象:

 知道有这样的东西或者知道他能干啥,但不知道具体怎么做。

比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、 三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念 在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

又如:有时候,我们可能想要构造一个很抽象的父类对象,它可能仅仅代表一个分类或抽象概念,它的实例没有任何意义,因此不希望它能被实例化。例如:有一个父类“ 水果(Fruit)”,它有几个子类“苹果(Apple)”、“橘子(Orange)”、“香蕉(Banana)”等。水果在这里仅仅只是作为一个分类,显然水果的实例没有什么意义(就好像一个人如果告诉你他买了一些水果但是却不告诉你是苹果还是橘子,你很难想象他到底买的是什么。)。而水果类又要能被子类化,这就要求我们使用抽象类(abstract class)来解决这个问题。


 实现抽象有两种方式:接口 和 抽象类

接口:

作用:抽象。

理解:一组行为的抽象。

比喻:一个能飞的东西(强调的是飞这个行为,谁知道他是鸟还是飞机,也不知道他怎么飞)

实现他:说明子类可以做这些事情

 

 

抽象类:

作用:抽象。

理解:一类对象的抽象。

 比喻:能吃东西的动物(吃东西是吃肉还是吃草,我现在不知道,只能以后具体到食肉动物还是食草动物时才知道)

继承他:说明子类就是这一类对象中的一种。

 

二.封装:

封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。


三、多态

方法的重写、重载

父类对象可以指向不同子类对象(用继承和接口实现)


四、继承: 

 对多重继承的误解:大多数人认为,接口的意义在于顶替多重继承。众所周知Java没有c++那样多重继承的机制,但是却能够实作多个接口。其实这样做是很牵强的,接口和继承是完全不同的东西,接口没有能力代替多重继承,也没有这个义务。接口的作用,一言以蔽之,就是标志类的类别(type of class)。把不同类型的类归于不同的接口,OO的精髓,我以为,是对对象的抽象,最能体现这一点的就是接口。

继承的概念不用多说,很好理解。为什么要继承呢?因为你想重用代码?这绝对不是理由,继承的意义也在于抽象,而不是代码重用。如果对象A有一个run()方法,对象B也想有这个方法,所以有人就Class B extends A。这是不经大脑的做法。如果在B中实例化一个A,调用A的Run()方法,是不是可以达到同样的目的?如下:

    Class B
    {
    A  a=new A();
    a.run();
    }
    这就是利用类的聚合来重用代码,是委派模式的雏形,是GoF一贯倡导的做法。

请一定注意,继承的本意在于抽象,而非代码重用(虽然继承也有这个作用),这是很多Java烂书最严重的错误之一,它们所造成的阴影,我至今还没有完全摆脱,坏书害人啊,尤其是入门类的,流毒太大。什么时候应该使用继承?只在抽象类中使用,其他情况下尽量不使用。抽象类也是不能实例化的,它仅仅提供一个模版而已,这就很能说明问题。

    软件开发的万恶之源,一是重复代码而不是重用代码,二是烂用继承,尤以c++程序员为甚。Java中取缔多重继承,目的就是制止烂用继承,实是非常明智的做法,不过很多人都不理解。

 

 

 

   

你可能感兴趣的:(设计模式学习(一):java 面向对象特征:抽象、封装、多态、继承)