精华内容
下载资源
问答
  • 2020-02-09 16:56:31

    如果一个类含有抽象方法,则称这个类为抽象类。抽象类是用abstract关键词修饰的。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。如果一个类继承了抽象类,那么就必须为抽象类中的抽象方法提供定义。如果不那么做,那继承的类也为抽象类。( 抽象方法是一种特殊的方法,它只有声明,而没有具体的实现。)

    抽象类和普通类一样,同样可以拥有成员变量和普通的成员方法。但是抽象类中的抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
     


    接口是对行为的抽象,是用interface关键词修饰的。

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


    总的来说,抽象类和接口主要有以下三种区别:

    1、抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
    2、抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
    3、一个类只能继承一个抽象类,而一个类却可以实现多个接口。

    更多相关内容
  • Java 抽象类和接口区别

    千次阅读 2022-03-15 20:06:50
    接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块静态方法; 一个类只能继承一个抽象类,而一个类却可以实现多个接口。 二、设计层面上的区别 a.抽象类是对一种事务的抽象,是对整个类进行...

    一、语法层面上的区别

    • 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract (隐式声明)方法;
    • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final(隐式声明)类型的(必须在声明时赋值);
    • 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
    • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

     

    二、设计层面上的区别

            a. 抽象类是对一种事务的抽象,是对整个类进行抽象,包括属性,行为(方法)。接口是对行为(行为)的抽象。如果一个类继承或实现了某个抽象类,那么一定是抽象类的种类(拥有同一种属性或行为的类)。

      b. 设计层面不同,抽象类作为很多子类的父类,是一种模板设计,而接口是一种规范,它是一种辐射式设计,也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象方法中添加实现,子类可以不用变更,而对于接口不行,如果接口进行了变更,那么实现它的类都需要做变更。

    三、示例

    • java接口的修饰符:abstract(默认不写。interface本身就是抽象的,加不加abstract都一样)
    •  接口中字段的修饰符:public static final(默认不写)

     解释如下:

    • public: 使接口的实现类可以使用该常量;
    • static:接口不涉及和任何具体实例相关的细节,因此接口没有构造方法,不能被实例化,没有实例变量,只有静态变量。(static修饰就表示它属于类的,随的类的加载而存在的,当JVM把字节码加载进JVM的时候,static修饰的成员已经在内存中存在了。如果是非static的话,就表示属于对象的,只有建立对象时才有它,而接口是不能建立对象的,所以接口的常量必须定义为static。)
    • final:接口中不可以定义变量,即定义的变量前都要加上final修饰,使之成为常量,且必须赋初始值!(final修饰就是保证接口定义的常量不能被实现类去修改,如果没有final的话,由子类随意去修改的话,接口建立这个常量就没有意义了。
    • 接口中方法的修饰符:public abstract(默认不写)

             接口方法仅仅描述方法能做什么,但是不指定如何去做,所以接口中的方法都是抽象的(abstract方法)

    四、注意

    1 接口和抽象类分别在什么时候使用

            a. 如果拥有一些方法,并想让他们中的一些有默认的具体实现,请选择抽象类

      b. 如果想实现多重继承,那么请使用接口,由于java不支持多继承,子类不能继承多个类,但一个类可以实现多个接口,因此可以使用接口来解决。

      c. 如果基本功能在不断变化,那么就使用抽象类,如果使用接口,那么每次变更都需要相应的去改变实现该接口的所有类。

    2 JDK8中接口的默认方法和静态方法

            JDK8中,Oracle引入默认方法和静态方法,用来减少抽象类和接口的差异,可以在接口中提供默认的实现方法并实现该接口的类不用强制去实现这个方法。JDK8中接口的静态方法只能通过接口名直接去调用,接口中的默认方法因为不是abstract的,所以可重写,也可以不重写。

    3 优先级问题

            当一个类,既继承了一个父类,又实现多个接口,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法

    4 接口的继承

            一个接口能继承另外一个或者多个接口,这和类之间的继承比较相似,接口的继承使用extends关键字,子接口继承父接口的方法.如果父接口中的默认方法有重名的,那么子接口需要重写一次

    5 默认方法

            使用default修饰,不可省略,供子类调用或者子类重写

      可以继承,可以重写,二选一,但是只能通过实现类的对象来调用

      接口中,有多个默认方法时,实现类都可继承使用,如果继承方法有重名的,必须重写一次

    6 其他

            1.接口中无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰

      2.接口中,没有构造方法,不能创建对象

      3.接口中,没有静态代码块

    展开全文
  • Java抽象类和接口区别

    万次阅读 多人点赞 2019-02-07 14:10:07
    Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口...

    对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口和抽象类。

    一、抽象类

    在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:

    abstract void fun();

    抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

    下面要注意一个问题:在《JAVA编程思想》一书中,将抽象类定义为“包含抽象方法的类”,但是后面发现如果一个类不包含抽象方法,只是用abstract修饰的话也是抽象类。也就是说抽象类不一定必须含有抽象方法。个人觉得这个属于钻牛角尖的问题吧,因为如果一个抽象类不包含任何抽象方法,为何还要设计为抽象类?所以暂且记住这个概念吧,不必去深究为什么。

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

     从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。

    包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:

    • 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
    • 抽象类不能用来创建对象;
    • 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

    在其他方面,抽象类和普通的类并没有区别。

    二、接口

    接口,英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数。从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。在Java中,定一个接口的形式如下:

    [public] interface InterfaceName {
    
     
    
    }

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

    要让一个类遵循某组特地的接口需要使用implements关键字,具体格式如下:

    class ClassName implements Interface1,Interface2,[....]{
    
    }

    可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。

    三、抽象类和接口的区别

    1.语法层面上的区别

    • 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
    • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
    • 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
    • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

    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() {
    
          //....
    
        }
    
    }

    最后再用一个表格的形式来总结一下抽象类和接口的区别:

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

     我有一个微信公众号,经常会分享一些Java技术相关的干货;如果你喜欢我的分享,可以用微信搜索“Java团长”或者“javatuanzhang”关注。

    展开全文
  • Java 抽象类接口区别是什么?

    千次阅读 2021-02-27 11:40:04
    Java 抽象类接口区别是什么?1、抽象类可以提供某些方法的部分实现,而接口不可以;2、抽象类是单个继承机制,其子类不一定要实现父类中的所有没实现的方法,而接口一个类可以有多个接口,并且方法都要实现。理解...

    445b47bdf1c2645026931439f87673c3.png

    Java 抽象类与接口区别是什么?

    1、抽象类可以提供某些方法的部分实现,而接口不可以;

    2、抽象类是单个继承机制,其子类不一定要实现父类中的所有没实现的方法,而接口一个类可以有多个接口,并且方法都要实现。

    理解抽象类

    abstractclass和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstractclass翻译而来,它表示的是一个抽象体,而abstractclass为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢?

    在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

    在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则 OCP(Open-ClosedPrinciple),抽象类是其中的关键所在。推荐教程:《Java教程》

    展开全文
  • java抽象类接口区别

    千次阅读 2019-03-08 20:39:50
    抽象类和接口都包含类可以由子类继承实现的成员,但抽象类是对根源的抽象,而接口上是对动作的抽象。抽象类的功能要远超过接口,那为什么还要使用接口呢?这主要是由于定义抽象类的代价高...抽象类和接口区别主要...
  • Java接口和抽象类区别

    千次阅读 2020-12-06 15:13:33
    接口中可以有变量方法,但是变量会被隐式的指定为public static final变量,而方法会被指定为public abstract【所有方法在接口中不能有实现,也说明接口中都是抽象方法】,(Java 8 开始接⼝⽅法可以有默认实现)...
  • Java 抽象类和接口

    千次阅读 热门讨论 2021-11-14 16:09:56
    接口的特征三、抽象类和接口区别 一、抽象类 1.抽象类 1.1抽象类的定义 在Java面向对象当中,所有的对象都是用过类进行描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类没有包含足够多的信息来描述一个...
  • 主要介绍了Java抽象类和接口,结合实例形式深入浅出的分析了java抽象类接口的功能功能,定义,用法及区别,需要的朋友可以参考下
  • java抽象类和接口最本质的区别接口里不能实现方法--接口中的方法全是抽象方法。抽象类中可实现方法--抽象类中的方法可以不是抽象方法,下文给大家简单介绍下,需要的的朋友参考下
  • Java中的抽象类和接口

    千次阅读 多人点赞 2022-04-08 15:17:42
    各位铁汁们大家好呀!今天让我们继续学习java,看看java中的抽象类和接口到底是什么? 里面也会讲到多态呀,一起来看看吧
  • 1. 抽象类 1.1 抽象方法理解 定义: 只有方法的申明,没有具体的实现即方法体。 例如: abstract void test(); 注意: 抽象方法必须使用abstract修饰,否则编译时会...1.3 抽象类和普通类的区别 1.抽象方法必须被访
  • 主要介绍了Java接口和抽象类区别与相同之处,本文讲解了抽象类的概念、接口的概念、接口和抽象类区别与联系等内容,需要的朋友可以参考下
  • 主要介绍了java 抽象类接口区别介绍的相关资料,需要的朋友可以参考下
  • java接口和抽象类区别

    万次阅读 多人点赞 2018-09-21 23:18:35
    接口和抽象类区别? 接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制。 接口是公开的,不能有私有的方法或变量,接口中的所有方法都没有方法体,通过关键字interface实现。 抽象类是可以有...
  • Java抽象类接口有什么区别

    万次阅读 多人点赞 2019-06-13 20:55:16
    abstract classinterface是Java中对于抽象类定义两种机制,正是由于这两种机制的存在,才赋予Java强大的面向对象能力。abstract classinterface之间在对于抽象类定义的支持方面具有相当大的相似性,设置可以互相...
  • Java中的类、抽象类接口区别和联系
  • 主要介绍了Java接口和抽象类区别,对于Java的初学者来说是需要准确掌握的概念!
  • Java面试题(六) - 抽象类接口区别

    千次阅读 多人点赞 2019-03-21 13:33:53
    抽象类接口区别,这是一个经常被问到面试题,区别主要有以下几点,我们可以从几个方面进行分析: (一) 继承方面: (1) 抽象类只能单继承;接口可以多实现 (二) 成员属性方面: (1) 抽象类中可以有普通属性,也...
  • 主要介绍了java接口和抽象类区别与对比的相关资料,这里详细说明他们之家的区别,需要的朋友可以参考下
  •  1、Java接口和Java抽象类大的一个区别,在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概是Java抽象类的优点吧,但这个优点非常有用。 如果向一个抽象类里加入一个新的具体方法时,那么它...
  • 主要给大家介绍了关于java抽象类、抽象方法、接口与实现接口的相关资料,文中通过示例代码将四者介绍的非常详细,并且简单介绍了抽象类和接口区别,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
  • java抽象类接口区别

    2012-07-19 02:22:51
    深入浅出的说明java抽象类接口区别,让初学者更好的理解java抽象类与接口的概念
  • 下面会简单介绍抽象类和接口的定义,并根据它们的属性,了解他们的区别,同时也会引导出他们的适用场景。如有缺陷请斧正。 抽象类 定义:用abstract关键字修饰的类就是抽象类。例:abstract class A{} 注意: ...
  • JAVA-抽象类和接口区别总结

    千次阅读 2014-07-26 15:07:53
    抽象类和接口都很好的提供了一种将实现和接口分离的方法..  一、抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的。如果一个类没有足够的...
  • java抽象类和接口有什么意义

    千次阅读 2021-02-04 16:53:06
    为什么接口和抽象类不能实例化,为什么接口可以多个实现而抽象类只能单继承,特别是java8之后,抽象类和接口里面都可以写代码后,就更加分不清了,今天重新整理一下。 什么是抽象类(abstract class) 使用abstract...
  • 抽象类和接口都不能被直接实例化,如果二者要实例化,就涉及到多态  抽象类对象的引用必须执行一个实现了自己所有抽象方法的子类对象  接口对象的引用必须执行一个实现了自己所有方法的子类对象 接口里面...
  • Java语言中,abstract class interface 是支持抽象类定义的两种机制区别
  • 简述抽象类和接口区别-java接口和抽象类异同.docx
  • java抽象类和接口

    千次阅读 2019-05-14 17:34:15
    java抽象类和接口 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术:MyEclipse10 作者:朱海恩 撰写时间: 2019.04.30 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 583,289
精华内容 233,315
关键字:

java抽象类和接口区别

java 订阅