面向对象的理解 抽象类&接口

一、关于面向对象

1、什么是面向对象

在解释面向对象之前,先说说面向过程。学过C的同学都知道,C就是面向过程的一种语言。那什么是面向过程呢?比方说组装主机,对于面向过程,需要从0开始。买cpu,显卡,主板,电源,风扇,把这些都通过主板链接到一起。我需要清楚的知道主机组装的每一个步骤。

介绍了面向过程,再说会正题,什么是面向对象?对于上面的装主机过程面向对象会把主机先抽象成一个机箱,机箱里有cpu,显卡,主板,电源。用主机的人,不关心里面是怎么工作的,也不需要知道内部逻辑,只知道插上电源就能用。面向对象就是把一些行为,属性抽象成一个客观存在的实体。

2、为什么要有面向对象

面向对象产生的原因有下面两点:

2.1 计算机是帮助人们解决问题的,然而计算机终究是个机器,他只会按照人所写的代码,一步一步的执行下去,最终得到了结果,因此无论程序多么的复杂,计算机总是能轻松应付,结构化编程,就是按照计算机的思维写出的代码,但是人看到这么复杂的逻辑,就无法维护和扩展了。如前文所述的面向过程编程。

2.2 结构化设计是以功能为目标来设计构造应用系统,这种做法导致我们设计程序时,不得不将现实世界中的客体映射成应用程序的功能模块,这种转换过程,背离了人们观察和解决问题的基本思路。

可见结构化设计在设计系统的时候,无法解决重用、维护、扩展的问题,而且会导致逻辑过于复杂,代码晦涩难懂。于是人们就想,能不能让计算机直接模拟现实的环境,用人类解决问题的思路,习惯,步骤来设计相应的应用程序?这样的程序,人们在读它的时候,会更容易理解,也不需要再把现实世界和程序世界之间来回做转换,于是面向对象就产生了。

3、面向对象的好处

面向对象解决了系统的可维护性,可扩展性,可重用性。

我们都知道面向对象有三大特征,封装、继承和多态。那我们就来看看这三大特征是如何解决系统的可维护性,可扩展性和可重用性的。

3.1 封装:把一些属性和行为抽象成一个实体,并封装成一个对象。这样一来就可以在不影响其他部分的情况下,修改或是扩展这个对象。封装解决了系统的可维护型

3.2 继承:子类继承父类,可以继承父类的方法和属性。 实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性。

3.3 多态:消除类型之间的耦合。继承允许将对象视为它自己本身的类型或是其基类型来加以处理。多态方法调用允许一种类型表现出与其他相似类型之间的区别,只要他们都是从统一基类导出来的。这就实现了可维护性,可扩展性。

二、抽象类和接口

1、抽象类

定义:包含抽象方法的类叫做抽象类。如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的。

理解:抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板创建抽象类和抽象方法非常有用,因为他们可以使类的抽象性明确起来,并告诉用户和编译器打算怎样来使用他们。抽象类还是很有用的重构工具,因为他们使得我们可以很容易的将公共方法沿着继承层次结构向上移动。

应用:

1. 抽象类声明用abstract修饰

2. 抽象方法也通过abstract修饰

 1 public class HttpServlet extends GenericServlet {
 2     void service(ServletRequest req, ServletResponse res) {
 3         // implementation
 4     }
 5
 6     protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
 7         // Implementation
 8     }
 9
10     protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
11         // Implementation
12     }
13
14     // some other methods related to HttpServlet
15 }

2、接口

定义:接口是比抽象类更抽象的一个层次。是抽象方法的集合。接口只提供形式,而未提供任何具体实现。

理解:一个接口表示“所有实现了该特定接口的类看起来都像这样。”因此, 任何使用某个特定接口类的代码都知道可以调用该类的哪些方法,而且仅需要知道这些。因此,接口被用来简历类与类之间的协议。

应用:

    1. 创建接口的关键字为interface。

2. 接口也可以包含域,但是这些域隐式地是static和final的。

    3. 在Java7之前接口中只能定义方法,不能有具体的方法体。但在Java8中,我们也可以通过关键字default为接口定义默认方法了。

4. 我们可以在接口中显示的将方法声明为public的,但即使你不这么做,它们也是public的。

1 public interface Externalizable extends Serializable {
2
3     void writeExternal(ObjectOutput out) throws IOException;
4
5     void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
6 }

3、比较

参数 抽象类 接口
默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现
实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造器 抽象类可以有构造器 接口不能有构造器
与正常Java类的区别 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型
访问修饰符 抽象方法可以有publicprotecteddefault这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。
main方法 抽象方法可以有main方法并且我们可以运行它 接口没有main方法,因此我们不能运行它。
多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。

4、选择

说了这么多那我们应该什么时候使用抽象类和接口

4.1 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。

4.2 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它

4.3 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

参考:

Java编程思想(第4版)

什么是对象,为什么要面向对象,怎么才能面向对象?

原文地址:https://www.cnblogs.com/amei0/p/8963629.html

时间: 2024-10-11 00:50:02

面向对象的理解 抽象类&接口的相关文章

2019-05-17 Java学习日记之面向对象_多态&抽象类&接口

多态 多态的概述: A:多态(polymorphic) 事物存在的多种形态 B:多态前提 a:要有继承关系 b:要有方法重写c:要有父类引用指向子类对象 多态中的成员访问特点之成员变量: 成员变量:编译看左边(父类),运行看左边(父类)多态中的成员访问特点之成员方法:成员方法:编译看左边(父类),运行看右边(子类)多态中的成员访问特点之静态成员方法:静态方法:编译看左边(父类),运行看左边(父类)(静态和类相关,算不上重写,所以访问还是左边的)只有非静态的成员方法,编译看左边,运行看右边 多态的

JavaSE知识-09(面向对象_多态&抽象类&接口)

多态的概述及其代码体现 多态(polymorphic)概述 事物存在的多种形态 多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. class Demo1_Polymorphic { public static void main(String[] args) { Cat c = new Cat(); c.eat(); Animal a = new Cat(); //猫是一只动物 //父类引用指向子类对象 a.eat(); } } class Animal { pu

面向对象基础之抽象类与接口 下

在上篇博文中我们一起了解了抽象类,那么什么是接口呢?下面给大家简单介绍一下: 所谓接口,就是把隐式公共方法和属性组合起来,以封装特定功能的一个集合.一旦类实现了接口,类就可以支持接口所指定的所有属性和成员.声明接口在语法上与声明抽象类完全相同,但不允许提供接口中任何成员的执行方式,因此接口不能实例化,不能有构造方法和字段,不能有修饰符,如public等.在实现接口的类中必须实现接口中的所有方法和属性. 一个接口可以支持多个接口,多个类也可以支持相同的接口.需要注意的是,接口用interface关

面向对象设计中抽象类与接口的区别

在OOD(面向对象设计)中,经常会用到抽象类或接口,[注:在C++中,没有接口的概念,只有抽象类:而在Java中两者都存在].而在使用过程中,也许会有不少人认为接口和抽象类差不多,然后就想当然地觉得可以相互完全替换.事实上,虽然他们有很多相似点,但也有很大差异. 1.抽象类与接口的出现条件 在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样.并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类.抽象类往往用来表征我们

java面向对象编程(八)--抽象类、接口

1.抽象类 1.1抽象类概念 当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]. //抽象类的必要性[Demo124.java] public class Demo124 { public static void main(String[] args) { //Animal an=new Animal();抽象类不允许实例化 Animal an=new Cat(); an.cry(); an=new Dog(); an.cr

追本溯源 回归本质--深入理解抽象类和接口

挺不错的文章,以面向对象设计的高度审视抽象类和接口的本质 原文地址:http://dev.yesky.com/436/7581936.shtml 在 Java 语言中, abstract class 和 interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于abstract class和in

面向对象基础之抽象类与接口 上

在两年前学习C++的时候,知道抽象类这么一个概念,当时并不是很理解,如今在学习C#和设计模式的时候,再一次碰到了这个含糊不清的东西,同时又在C#中学习到了接口技术,接口也早有耳闻,但是当时理解的接口就是一个或者一组能够操作类中数据的函数或者方法.虽然老师举过很多例子,比如电视机这个事物,它对外的接口就是遥控器,遥控器里好多的按钮,按钮的下面就是各种各样的命令或者称之为方法. 当抽象类遇到接口的时候,顿时蒙圈了,这两个概念的确是让人很难区别,那么我今天就来总结一下抽象类和接口到底有哪些区别和联系,

php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念2.什么是对象?从类中拿到的具有具体属性值得个体,称为对象,对象是一个具体的个体 所以,面向对象即我们专注对象来处理问题,通过从一个个具有属性和功能的类中拿到对象来处理问题. 下面我们再来细说下面向对象的三大特征:继承/封装/多态 一.继承 在PHP中我们主要通关E

[.net 面向对象编程基础] (16) 接口

[.net 面向对象编程基础] (16) 接口 关于“接口”一词,跟我们平常看到的电脑的硬件“接口”意义上是差不多的.拿一台电脑来说,我们从外面,可以看到他的USB接口,COM接口等,那么这些接口的目的一就是让第三方厂商生产的外设都有相同的标准,也是提供一个对外通信或操作的入口. 只是C#的接口除了以上特点之外,还具有一种类似于模板的功能,我们定义一组接口,就像是一个模板.这点和抽象类不同,抽象类是先有子类或都子类的概念,从中抽象出一个类.而接口更像是我们要设计一台机器,先把这台机器对外的功能接