抽象类与接口基础知识复习

抽象类abstract详解

1.声明格式:abstract void fun();

2.抽象类为该类的所有子类提供一个通用模板,抽象类避免了子类设计的随意性,该类必须用abstract修饰,可以只声明不定义,子类继承后根据需要进行重写;

3.如果一个类含有抽象方法,则这个类为抽象类,该类必须用abstract修饰——因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象(new);

  注意:抽象类不一定必须含有抽象方法,只要用abstract修饰也是抽象类。

1 [public] abstract class ClassName {
2     abstract void fun();
3 }

4.抽象类不能实例化,即不能用new来实例化抽象类;

5.抽象类可以包含属性、方法、构造方法,但是不能用new来实例化,只能被子类调用/继承;

6.抽象类就是为了继承而存在的,抽象方法必须被子类实现/重写;

7.包含抽象方法的类称为抽象类,但并不意味着抽象类中只含有抽象方法,它也可以拥有普通的成员变量及成员方法,抽象类和普通类主要有三点区别:

    1):抽象方法必须为public或protected,因为private不能被子类继承,子类也就无法实现该方法,缺省默认为public;

    2):抽象类不能用来创建对象,因为抽象类不能实例化;

    3):如果一个类继承了抽象类,那么子类必须实现父类的抽象方法;如果子类没有继承父类的抽象方法,那么必须将子类也定义为abstract类;

接口interface 详解

1.定义接口:[public] interface InterfaceName { };

2.接口就是比“抽象类”还“抽象”的“抽象类”,接口不提供任何实现,接口是规范和具体实现的分离;

3.接口泛指供别人调用的方法或者函数,其本质是契约,就像我们人间的法律一样,制定好后大家都遵守;

4.接口中可以有变量和方法,注意:

  接口中的变量总是:public static final修饰,省略不写也是,且声明的同时必须初始化;

  接口中的方法总是:public abstract修饰,省略不写也是;

5.从接口的实现者角度看,接口定义了可以向外部提供的服务;

6.从接口的调用者角度看,接口定义了实现者能提供那些服务;

7.访问修饰符:只能是public或默认;

8.extends:接口可以多继承,子接口扩展某个父接口,将会获得父接口中所定义的一切;

9.implements:子类通过implements来实现接口中的规范;

10.让一个类遵循某组特定的接口用implements关键字:

class ClassName implements Interface1,Interface2,....{
    ······
}

11.

如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法;

如果一个抽象类遵循了某个接口,则可不实现该接口中的方法;

12.接口不能创建实例(不能new),但是可用于声明引用变量类型;

13.接口中只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法;

抽象类和接口的区别

1、语法区别:

  1)        一个类只能继承一个抽象类,而一个类却可以实现多个接口;

  2)        接口中不能含有静态代码块以及静态方法,而抽象类可以有;

  3)        抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

  4)        抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract方法;

2、设计层面上的区别

  抽象类是对事物的抽象,即对类抽象;而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口是对局部(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可。继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。

  抽象类最为很多子类的父类,它是一种模板式设计;而接口是一种行为规范,是一种辐射式设计。什么是模板式设计?最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

3、 抽象类的域没有特殊限制,接口的域自动为 public static final 的,在声明 的同时必须初始化;

4、 接口中定义的方法必须(自动为)是 public abstract 的,抽象类中的抽象 方法可以是默认类型或者 public 类型或者 protected 类型;

5、Implements一个接口必须 override 所有方法,extends一个抽象类则只要override抽象方法。一个类只能继承一个类(抽象类),但是可以实现多个接口;

6、从选择上来讲,当所表达的意思是某些事物的共性的时候最好使用接口, 而当表达的意思是某一个具体的事物的时候就用抽象类;

具体实例

门和警报的例子:门都有open()和close()两个动作,此时我们可以通过抽象类和接口来定义这个抽象概念:

abstract class Door{

      public abstract void open();

      public abstract void close();

}

或者

interface Door{

      public abstract void open();

      public abstract void close();

}

但是现在如果我们需要门具有报警alarm()功能,如何实现?

思路一: 将这三个功能都放在抽象类中,这样一来所有继承于这个抽象类的子类都具备了报警功能,但并不是所有门都具备报警功能;

思路二: 将这三个功能都放在接口中,需要用到报警功能的类就都要实现这个接口中的open()和close(),但并不是所有类都要实现open()和close(),如报警器;

综上可以看出,门的open()、close()、alarm()是属于两个不同范畴内的行为,open()和close()属于门固有行为,而alarm()是附加行为。因此最好的办法是单独将报警功能设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类并实现Alarm接口:

interface Alram {
  void alarm();
}

abstract class Door {
  void open();
  void close();
}

//下面是一个需要有报警功能的门

class AlarmDoor extends Door implements Alarm {
  void oepn() {
    //....
  }

  void close() {
    //....
   }

  void alarm() {
    //....
  }
}

原文地址:https://www.cnblogs.com/panweiwei/p/11909097.html

时间: 2024-10-14 11:14:05

抽象类与接口基础知识复习的相关文章

考试备战系列--软考--02基础知识复习

这部分主要是计算机基础知识的概念介绍,相关系列文章如下所示. 考试备战系列--软考--01基础架构概念 考试备战系列--软考--02基础知识复习 考试备战系列--软考--03综合知识复习 考试备战系列--软考--04考题收集 考试备战系列--软考--05案例收集 考试备战系列--软考--06论文准备 操作系统时计算机系统的核心系统软件,其他软件均建立在其上,其分类包括:单用户操作系统和批处理操作系统.分时操作系统和实时操作系统.网络操作系统和分布式操作系统.嵌入式操作系统.其4大特征为并发性.共

Java 接口基础知识

一.Java接口基础知识 1, Java语言不支持一个类有多个直接的父类(多继承),但可以实现(implements)多个接口,间接的实现了多继承. 2, 与Java接口相关的设计模式: 1, 定制服务模式 设计精粒度的接口,每个Java接口代表相关的一组服务,通过继承来创建复合接口 2, 适配器模式 当每个系统之间接口不匹配时,用适配器来转换接口 3, 默认适配器模式 为接口提供简单的默认实现 4, 代理模式 为Java接口的实现类创建代理类,使用者通过代理来获得实现类的服务 5, 标识类型模

php高级进阶系列文章--第二篇(PHP基础知识复习)

php基础知识复习 本文中对于简单的知识点只会提及一下(例如什么控制结构什么的),对于较有难度的详细复习下(例如面向对象的反射等等) 再次申明,本系列文章不是从最基础的开始复习,对于零基础的可能不适用,本文的初衷是我要准备攻读源码,在攻读前将之前的知识牢固下,太过简单的就写在文中了 1,echo print echo 可以输出一个或者多个字符串 print 只可以输出一个字符串,返回值总为1 2,PHP7中的组合比较符 echo 1 <==> 1 // 0 echo 1 <==>

c基础知识复习

C的发展历程 C原本是为了开发UNIX操作系统而设计的语言:如此说,应该C比UNIX更早问世,而事实并非如此,最早的UNIX是由汇编写的: C语言本来是美国人开发的,解读C的声明,最好还是用英语来读: 解读C声明的步骤: 1.首先着眼于标识符(变量名或者函数名) 2.从距离标识符最近的地方开始,依照优先顺序解释派生类型(指针.数组和函数).优先顺序说明如下: a.用于整理声明内容的括号: b.用于表示数组的[ ],用于表示函数的( ) c.用于表示指针的* 3.解释完成派生类型,使用 “of”.

linux基础知识复习

@(tigerfive)[linux,基础知识,复习笔记] linux基础复习(一) 今天只整理框架,具体内容之后详细整理吧 文件管理 文件基本操作>创建文件和目录>拷贝文件和目录>剪切文件和目录>删除文件和目录>查看文件和目录>查看文件属性>查看文件内容>过滤文件内容>编辑文件内容>统配符使用>命令别名 用户和组管理 用户基本操作>添加账户>设置密码>删除账户>修改密码组基本管理>创建组>查看组>

php高级进阶系列文章--第五篇(redis基础知识复习)

在实际工作中不仅需要使用到非常重要的关系型数据库mysql,同时也需要使用到redis,memcached,mongodb等进行数据存储,完成特定的产品需求,本节先复习redis的基础知识,高深部分后续会继续探讨 1,redis与其他的key-value形式缓存数据库的特点: 支持数据持久化,将内存中的数据保存到磁盘中,重启的时候再次加载进行使用 redis不仅有key-value格式的数据,同时也有list,set,zset,hash格式的数据结构存储数据 redis支持数据的备份,即Mast

c#基础知识复习

平时写代码也就依照样子画葫芦,重复着相同的工作,也很无聊,现在开始整理下,一些基础知识,都已经快忘记光了,写下来记录下,平时还可以重温下. 什么是属性? 比如: public class A{ public int Id{get;set;} public string Name{get;set;} } 上面是一个类,那么我们要访问的属性,就是: A  model=new A();//调用类 A.Id//Id就是属性 平时我们都是这么来写代码的.分析下:官网说法:属性结合了字段和方法的多个方面.对

C# 基础知识复习(十)---接口与接口继承

1.接口必须I开头: 2.只有申明,没有实现: 3.实现类在实现方法时,必须名字与接口一致: 4.实现类在实现继承接口时,必须把父接口的方法一并实现: 5.接口申明,默认是public的,这一点与class不同. C# 接口(Interface) 接口定义了所有类继承接口时应遵循的语法合同.接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分. 接口定义了属性.方法和事件,这些都是接口的成员.接口只包含了成员的声明.成员的定义是派生类的责任.

C# 基础知识复习(六)---继承

继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易.同时也有利于重用代码和节省开发时间. using System; namespace InheritanceApplication { class Shape { public void setWidth(int w) { width = w; } public void setHeight(int h) { height = h; } protected int width; protected int height;