接口】【Java基础】java接口和抽象类的异同

2021-01-22 16:48发布

15条回答
桥豆麻袋
2楼 · 2021-01-22 17:32

一、抽象类: (关键字abstract)


java抽象类定义


  在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。


  抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。


  由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。


  父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。


  在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。



  为什么会出现抽象类?


    在不断抽取过程中,将共性内容中的方法声明抽取,但是方法内容不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstract所标示,声明为抽象方法。


    抽象方法所在类一定要标示为抽象类,也就是说该类需要被abstract关键字所修饰。



  抽象类的特点:


  1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量) 。


  2:抽象方法只定义方法声明,并不定义方法实现。


  3:抽象类不可以被创建对象 ( 实例化 ) 。


  4:抽象类必须由其子类覆盖了所有的抽象方法后,该子类才可以实例化。否则,该子类还是抽象类。



  抽象类的细节:


  1、抽象类中是否有构造函数?


    有,用于给子类对象进行初始化。


  2、抽象类中是否可以定义非抽象方法?


  可以。其实,抽象类和一般类没有太大的区别,都是在描述事物,只不过抽象类在描述事物时,有些功能不具体。所以抽象类和一般类在定义上,都是需要定义属性和行为的。只不过,比一般类多了一个抽象函数。而且比一般类少了一个创建对象的部分。


  3、抽象关键字 abstract 和哪些关键字不可以共存?


    private 。抽象方法需要被子类方法覆盖才可以使用,private修饰的方法不可以被子类继承。


    static 。static和abstract同时修饰一个方法时,被static修饰的方法,可以直接被类名调用,此方法没有内容,调用此方法没有意义。


    final 。当final和abstract同时修饰一个方法时,abstract修饰的方法必须被子类覆盖才能使用,而被final修饰的方法不能被覆盖。


  4、抽象类中可不可以不定义抽象方法?


    可以。不定义抽象方法目的是不让抽象类创建对象。


  5、抽象类一定是父类吗?


    是的,因为需要被其子类覆盖其所有的抽象方法才能使用。



  二、接口:(关键字interface).


  为什么会出现接口?


    当一个抽象类中,所有的方法都是抽象方法时,这时可以将该抽象类用另一种形式定义和表示,就引入了接口的概念。


  1、是用关键字 interface 定义的。


  2、接口中包含的成员,最常见的有全局常量、抽象方法。


  注意:接口中的成员都有固定的修饰符。


  成员变量: public static final 。


  成员方法: public abstract 。


  接口的表现形式:


  interface Inter


  {


  public static final int x = 3;


  public abstract void show();


  }


  3、接口中有抽象方法,说明接口不可以实例化 。接口的子类必须实现了接口中所有的抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。


  4、类与类之间存在着继承关系,类与接口之间存在的是实现关系。继承用 extends ;实现用 implements ;


  5、接口和类不一样的地方,就是,接口可以被多实现 ,这就是多继承改良后的结果。java 将多继承机制通过多实现来体现。


  6、一个类在继承另一个类的同时,还可以实现多个接口。所以接口的出现避免了单继承的局限性。还可以将类进行功能的扩展。


  7、其实 java 中是有多继承的。接口与接口之间存在着继承关系,接口可以多继承接口。



  接口都用于设计上,设计上的特点:


  1、接口是对外提供暴露的规则。


  2、接口是功能的扩展。


  3、接口的出现降低了耦合性。



  抽象类与接口异同点:


  抽象类:一般用于描述一个体系单元,将一组共性内容进行抽取。特点:可以在类中定义抽象内容让子类实现,可以定义非抽象内容让子类直接使用。它里面定义的都是一些体系中的基本内容。


 接口: 一般用于定义对象的扩展功能,是在继承之外还需这个对象具备的一些功能。



  抽象类和接口的共性:都是不断向上抽取的结果。


  抽象类和接口的区别:


  1、抽象类只能被继承,而且只能单继承。


  接口需要被实现,而且可以多实现。


  2、抽象类中可以定义非抽象方法,子类可以直接继承使用。


  接口中都有抽象方法,需要子类去实现。


  3、抽象类使用的是 is a 关系。


  接口使用的 like a 关系。


  4、抽象类的成员修饰符可以自定义。


  接口中的成员修饰符是固定的。全都是public的。


jianxiangxiong
3楼 · 2021-01-22 19:05

1、从声明上:

i. 抽象类是一个类,使用class声明;还需要使用关键字abstract修饰;

ii. 接口不是一个类,使用interface声明;

2、从能够书写的成员上看:

i. 抽象类是一个类,可以书写类中可以书写的成员,和抽象函数;

ii. 接口只能书写成员变量和抽象函数,而且修饰符是固定的;

3、从有无构造函数上看:

i. 抽象类必须有构造函数;

ii. 接口没有构造函数

4、从作用上看:

i. 抽象类是父类,用来描述所有子类的共性信息的,只是描述的有些功能是不具体的;

ii. 接口是用来描述不属于继承体系的扩展功能的;还可以定义规则;

5、继承关系上:

i. 抽象类和类之间是继承关系,只支持但继承和多重继承;

ii. 接口和类之间是实现关系,一个实现类可以实现多个接口;

接口和接口之间是继承关系,可以多继承和多重继承;


猫的想法不敢猜
4楼 · 2021-01-24 11:12

接口与抽象类的区别

不同点

抽象类接口
可以有构造方法,子类创建时初始化没有构造方法
可以有抽象方法和具体方法有抽象方法和默认(jdk8)、静态(jdk8)、私有方法(jdk9)
可以有成员变量没有成员变量,只有public static final修饰的常量(无默认值)
抽象类中抽象方法访问权限有public、protected、包访问权限接口中抽象方法只能是public abstract修饰的(默认),可以省略不写
一个类只能继承一个抽象类一个类可以实现多个接口
相同点

  1. 不能被实例化

  2. 可以将抽象类和接口类型作为引用类型

  3. 一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类


天才小馒头
5楼 · 2021-01-24 19:49

抽象类是一种对事物的抽象,而接口是一种对行为的抽象; 抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。 抽象类是一种模板式设计,而接口是一种行为规范,是一种辐射式设计。

善良的人
6楼 · 2021-01-24 21:29

抽象类:一般用于描述一个体系单元,将一组共性内容进行抽取。特点:可以在类中定义抽象内容让子类实现,可以定义非抽象内容让子类直接使用。它里面定义的都是一些体系中的基本内容。


 接口: 一般用于定义对象的扩展功能,是在继承之外还需这个对象具备的一些功能。


锦衣夜行1
7楼 · 2021-01-24 22:57

java抽象类定义


  在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。


  抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。


  由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。


  父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。


  在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。


722
8楼 · 2021-01-25 09:44

1、从声明上:

i. 抽象类是一个类,使用class声明;还需要使用关键字abstract修饰;

ii. 接口不是一个类,使用interface声明;

2、从能够书写的成员上看:

i. 抽象类是一个类,可以书写类中可以书写的成员,和抽象函数;

ii. 接口只能书写成员变量和抽象函数,而且修饰符是固定的;

3、从有无构造函数上看:

i. 抽象类必须有构造函数;

ii. 接口没有构造函数

4、从作用上看:

i. 抽象类是父类,用来描述所有子类的共性信息的,只是描述的有些功能是不具体的;

ii. 接口是用来描述不属于继承体系的扩展功能的;还可以定义规则;

5、继承关系上:

i. 抽象类和类之间是继承关系,只支持但继承和多重继承;

ii. 接口和类之间是实现关系,一个实现类可以实现多个接口;

接口和接口之间是继承关系,可以多继承和多重继承;


pipi雪
9楼 · 2021-01-25 10:20

类是对象的模板,抽象类和接口可以看做是具体的类的模板。

由于从某种角度讲,接口是一种特殊的抽象类,它们的渊源颇深,有很大的相似之处,所以在选择使用谁的问题上很容易迷糊。我们首先分析它们具有的相同点。

都代表类树形结构的抽象层。在使用引用变量时,尽量使用类结构的抽象层,使方法的定义和实现分离,这样做对于代码有松散耦合的好处。

都不能被实例化。

都能包含抽象方法。抽象方法用来描述系统提供哪些功能,而不必关心具体的实现。

下面说一下抽象类和接口的主要区别。

1) 抽象类可以为部分方法提供实现,避免了在子类中重复实现这些方法,提高了代码的可重用性,这是抽象类的优势;而接口中只能包含抽象方法,不能包含任何实现。

抽象类A有两个子类B、C,由于A中有方法method2的实现,子类B、C中不需要重写method2方法,我们就说A为子类提供了公共的功能,或A约束了子类的行为。method2就是代码可重用的例子。A 并没有定义 method1的实现,也就是说B、C 可以根据自己的特点实现method1方法,这又体现了松散耦合的特性。

再换成接口看看:

接口A无法为实现类B、C提供公共的功能,也就是说A无法约束B、C的行为。B、C可以自由地发挥自己的特点现实 method1和 method2方法,接口A毫无掌控能力。

2) 一个类只能继承一个直接的父类(可能是抽象类),但一个类可以实现多个接口,这个就是接口的优势。

对于C类,将没有机会继承其他父类了。

综上所述,接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守这样一个原则:

行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类。

选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能。


相关问题推荐

  • 回答 4

    对于接口测试,首先测试人员要懂代码,你只需要知道接口的作用是什么就可以了,其次,自己去读开发的代码。然后,根据该接口功能及代码写测试用例:根据该接口参数,构造不同的用例,测试接口在参数合法及非法情况下能否达到预期效果,根据该接口中的逻辑,测...

  • 回答 5

    Http接口是互联网各系统之间对接的重要方式之一,使用http接口,开发和调用都很方便,也是被大量采用的方式,它可以让不同系统之间实现数据的交换和共享,但由于http接口开放在互联网上,那么我们就需要有一定的安全措施来保证不能是随随便便就可以调用;目前...

  • 回答 15

    java里最常用的是关键字,这些关键字可以说是程序中的关键,我都帮你整理出来哈关键字含义abstract表明类或者成员方法具有抽象属性assert断言,用来进行程序调试boolean基本数据类型之一,声明布尔类型的关键字break提前跳出一个块byte基本数据类型之一,字节...

  • 回答 14

    1、利于代码的规范这样做的目的一方面是为了给开发人员一个清晰的指示,告诉他们哪些业务需要实现;同时也能防止由于开发人员随意命名而导致的命名不清晰和代码混乱,影响开发效率。2、有利于对代码进行维护可以一开始定义一个接口,把功能菜单放在接口里,然...

  • 回答 6
    已采纳

    1、接口类似于类,但接口的成员都没有执行方式,它只是方法、属性、事件和索引的组合而已,并且也只能包含这四种成员;类除了这四种成员之外还可以有别的成员(如字段)。2、不能实例化一个接口,接口只包括成员的签名;而类可以实例化(abstract类除外)。3、接...

  • 回答 7

    第一步我们首先需要知道java中的接口指的是抽象方法的集合,一个抽象类型,一般以interface来声明,需要注意的是接口不是类第二步我们可以看一下接口声明的格式,接口中的抽象方法都是隐式的,所以声明不需要abstract关键字,接口中的变量只能是 public stati...

  • 回答 9

    1、定义接口的重要性:在Java编程,abstract class 和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才使得Java成为面向对象的编程语言。2、定义接口有利于代码的规范:对于一个大型项目而言,架构师往往会对一些主要的接口来进行定义,...

  • 回答 9

    1.java.lang.StringString类无可争议的获得冠军,应该没有人会否认这一点,这是一个最终类,用于创建/操作不可变的字符串文字。2.java.lang.SystemSystem类的使用取决于你工作的项目类型,你可能没有在项目中使用过它,但它仍然是受欢迎的Java类之一,这是一...

  • 回答 1

    需要启动网络服务

  • 回答 15
    已采纳

    这个其实和接口测试的场景密不可分的,比如说:外部接口测试:    必须先接口测试通过了,才能执行功能测试子系统或者各个模块之间的联调测试:    必须各子系统后台代码完成,并提供接口才可以完成测试,一般来说都要求各子系统功能测试通过后再进行...

  • 回答 2

    接口调用一般分为前端调用和后端调用。百度API有很多官方文档和接口说明,在调用时传入相对应的数据。如果在后端python代码中调用可以借助:requests模块实现。requests模块主要用于模拟浏览器进行访问。也可以用于请求某些接口获取数据。...

没有解决我的问题,去提问