java接口和抽象类的区别(经典面试题)

要了解接口和抽象类的区别,首先需要明白接口和抽象类的定义。

1.抽象类

包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:
  1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
  2)抽象类不能用来创建对象;
  3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

public  abstract   class BDemo4   {public   int a=1; //可以定义各种类型变量public  void aFun(){System.out.println("这是抽象类");}// public  void add();普通方法一定要有方法体public abstract void bFun();  //抽象类中只有abstract抽象方法才能被之类重写
}//  BDemo4 bDemo4=new BDemo4() ;  抽象类不能用来创建对象
public class BDemo3 extends BDemo4 {private static BDemo4 bDemo3=new BDemo3();  //这个是存放在堆的对象,bDemo3是存放在方法区中的常量的一个引用//private static BDemo3 bDemo3;//private static BDemo2 car;  //静态变量是存放到方法区里面的public static void main(String[] args) {Car car=new BDemo2();   // 对象存放在堆空间中,但是对象的引用是放在局部变量表中car.OpenCar();//BDemo4 bDemo3=new BDemo3();/*** 不能调用方法,因为 bDemo3知识存放在方法区的静态常量,不属于对象,没有引用*/bDemo3.aFun();bDemo3.bFun();int a = bDemo3.a;System.out.println(a);}/*** 静态类的未实现方法必须实现*/@Overridepublic void bFun() {System.out.println("这啥啊");}}

2.接口

接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,jdk8可以实现方法,通过default ,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

在Java中可以为接口定义一个默认方法的实现,使用的关键字就是default,有了默认方法,实现类就可以不对接口中的默认方法进行重 写。

public interface demo {public abstract void add();public default void  add1()  //方法可通过default实现{System.out.println("nihao1");}
}

3.接口和抽象类的区别

1.语法层面上的区别

1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法, jdk8之后可以实现方法,通过default ;

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

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

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

2.设计层面上的区别

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

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

下面看一个网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:

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

或者:

interface Door {public abstract void open();public abstract void close();
}

但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:

1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;

2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。

从这里可以看出, Door的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() {//....}
}

java接口和抽象类的区别(经典面试题)相关推荐

  1. java接口和抽象类的区别和作用

    java接口和抽象类的区别和作用 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过(implements)接口的方 ...

  2. java接口和抽象类的区别

    Java基础之接口与抽象类的区别 1.基本语法区别 Java中接口和抽象类的定义语法分别为interface与abstract关键字. 抽象类:在Java中被abstract关键字修饰的类称为抽象类, ...

  3. 接口和抽象类的区别(面试题)

    接口和抽象类的区别(*) 语法上 相同点 接口和抽象类都能定义属性和方法 接口和抽象类都只是特殊的类,都是通过子类来操作 抽象类和接口中都可以没有抽象方法 接口和抽象类都不能直接创建对象 接口和抽象类 ...

  4. java 接口与抽象类的区别

    1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法 ...

  5. Java 接口和抽象类的区别

    接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的.接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static f ...

  6. java 接口和抽象类的区别6_JAVA基础篇-接口和抽象类的区别

    .前言 JAVA是一种面向对象语言,具备抽象(Abstract),封装(packing),继承(extends),多态(polymorphic)四大特性. 我们重点从oop思想∠来分析. .在面向对象 ...

  7. java 接口和抽象类的区别6_Java抽象类与接口的区别

    很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看看抽象类.接口各自的特性. ...

  8. java 关注公众号没有调接口_高频面试题:接口和抽象类的区别

    作为一个基础的Java高频面试题,是所有Java面试者必须烂熟于心的.当然不能死记硬背,可以通过实际地写几个小demo,边实际操作边理解,既能感受到编程的快乐,更重要的是真的理解记住了二者的区别. 此 ...

  9. Java接口学习(接口的使用、简单工厂、代理模式、接口和抽象类的区别)

    前言引入 官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 我的 ...

最新文章

  1. 大规模使用 Apache Kafka 的20个最佳实践
  2. 【CV】基于python和OpenCV构建智能停车系统
  3. Sql Server 监控 Job 执行情况
  4. php curl 防止采集,php多线程采集网页的解决办法 curl多线程采集
  5. vaex 处理海量数据_核心业务“瘦身”进行时!手把手带你搭建海量数据实时处理架构...
  6. oracle实例是否有dbid,Oracle如何获得数据库的DBID
  7. 如何通过BBED找回删除数据
  8. Python实现抓取CSDN博客首页文章列表
  9. 【Rényi差分隐私和零集中差分隐私(差分隐私变体)代码实现】差分隐私代码实现系列(九)
  10. Docker卸载镜像
  11. 【python自动化第十篇:】
  12. Mac系统如何使用文件标记功能?
  13. 分支定界 matlab,分支定界法matlab程序
  14. java梯形面积代码_Java面向对象练习题之梯形面积
  15. python如何自己写库_亲自动手写一个python库(二)
  16. 单片机电脑计算机键盘设计,客制pc小键盘,CH552单片机HID键盘,电脑多媒体小键盘...
  17. 10个实用的Excel技巧
  18. 客服整理的聊天话术怎么导入到新电脑上面?
  19. 中文版智能ABC如何移植到英文OS
  20. 计算机单元格数值不保留小数,EXCEL单元格数值实现真正保留2位小数的方法

热门文章

  1. 一分钟之内搭建自己的直播服务器?
  2. CGB2109-Day12-用户模块管理
  3. Linux lseek函数
  4. Linux上安装MySQl超详细教程(CentOS系统)
  5. python绘制语谱图(详细注释)
  6. jQuery取值和赋值的基本方法
  7. 算法精品讲解(2)——DP问题入门(适合零基础者,一看就会)
  8. DP问题之01背包如此简单
  9. BLAST中的E值的理解
  10. 初识SecureCRT工具