资讯专栏INFORMATION COLUMN

抽象类和接口的区别已经变了

wow_worktile / 3151人阅读

摘要:抽象方法没有方法体抽象方法权限修饰符不能为抽象方法的目的就是为了让子类继承重写的,所以抽象方法不能私有,不能修饰。另外,添加默认方法不会影响函数式接口的使用。

原文:抽象类和接口的区别已经变了

随着JDK的不断迭代,抽象类和接口的区别已经有了些许改变,你是否还停留在JDK 7 的答案呢?

定义

抽象类定义通过 abstract class

public abstract class A {}

接口定义通过 abstract(默认) interface

public abstract interface A {}
派生方式

子类继承抽象类通过 extends , 单继承

public abstract class A {}
public class B extends A {}

抽象类实现接口通过 implements , 多实现,接口继承接口通过 extends

public interface A {}
public interface B {}

public interface C extends A {}

public class D implements B,C {}

子类(非抽象类)必须实现 抽象父类或接口 的全部未实现方法

实例化

抽象类和接口均不能实例化

抽象类可以有构造方法,接口不能有构造方法

public abstract class A {
  public A () {}
}
属性

接口中定义属性只能是 (public)静态常量

public interface A {
  //默认(public static final) String A="ABC";
  String A = "ABC";
}

抽象类中可以定义有任意变量常量

//任意访问修饰符的变量及常量
public abstract class A {
    private String a = "a";
    boolean b = true;
    public char c = "a";
    protected int d = 2;
    public static final int e = 1;
}
方法 抽象类

抽象类中可以和普通类中一样拥有各自普通方法,也可以拥有(不必须)抽象方法。

抽象方法没有方法体

抽象方法权限修饰符不能为 pirvate

public abstract class A {

  // protected or default
    public abstract void a();
}
抽象方法的目的就是为了让子类继承重写的,所以抽象方法不能私有,不能final修饰。
接口 JDK 7

只能有方法的声明

方法必须声明为 public (默认)

public interface A {
  //默认(public abstract) void test();
    void test();
}
JDK 8

增加默认实现方法

public interface A {
  // 这里的 default 不能省略
  public(默认自动添加) default void defaultMethod(){
    //do something
  } 
}
默认方法的出现主要是面向类库的开发者的,在堆接口进行扩展时,大量的实现类会让人望而却步。拥有默认方法后,子类可直接继承使用或重写。另外,添加默认方法不会影响函数式接口的使用。

增加静态方法

public interface A {
  // 静态方法
  public(默认自动添加) static void staticMethod(){
    //do something
  }
}
静态方法的调用直接通过接口名调用A.staticMethod() ,子类无法重写(override), 但可以有同名方法。
JDK 9

增加私有方法

public interface A {
  // 不能被子类继承或重写
  private void privateMethod(){
    //do something
  } 
}

增加私有静态方法

public interface A {
  // 不能被子类继承或重写
  private static void privateStaticMethod(){
    //do something
  } 
}
这两种私有方法其实是对JDK8 默认方法和静态方法 的补充,这样可以避免代码的冗余。
设计

抽象类是对一组类的共同特征进行抽象 ,是子类的模板(is-a)

接口是对行为的抽象,是一种行为的规范和约束 (like-a)

往期文章一览

千万不要这样使用 Arrays.asList !

八张图带你认识Java

Java开发必备手册

关注微信公众号 「码上实战」 回复 :面试视频 和 架构师 送你非常不错的资料!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75624.html

相关文章

  • 抽象类和接口区别

    摘要:抽象类是对整个类整体进行抽象,包括属性行为,但是接口却是对类局部行为进行抽象。因此最好的解决办法是单独将报警设计为一个接口,包含行为设计为单独的一个抽象类,包含和两种行为。 抽象类和接口的区别 1.语法层面上的区别   1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;   2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是pub...

    ThinkSNS 评论0 收藏0
  • java抽象类和接口总结

    摘要:如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。抽象类是对整个类整体进行抽象,包括属性行为,但是接口却是对类局部行为进行抽象。因此最好的解决办法是单独将报警设计为一个接口,包含行为设计为单独的一个抽象类,包含和两种行为。 一、抽象类 二、接口 三、抽象类和接口的区别 一、抽象类 在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现...

    荆兆峰 评论0 收藏0
  • 多维度分析:抽象类和接口区别

    摘要:本文中,作者通过多个方面深入剖析抽象类和接口的区别,并结合经验供读者借鉴学习,本文系工程师编译整理。在开发人员岗位面试时,是否了解抽象类和接口之间的基本区别是一个很重要的考量因素。 【编者按】本文作者是Sebastian Malaca,是面向对象编程的狂热者,不断深化研究整洁代码和高代码质量。本文中,作者通过多个方面深入剖析抽象类和接口的区别,并结合经验供读者借鉴学习,本文系 OneA...

    chengtao1633 评论0 收藏0
  • Java抽象类与接口区别

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

    Ethan815 评论0 收藏0
  • PHP设计模式(二):抽象类和接口

    摘要:在设计模式中,抽象类不能够被实例化初始化,但是可以依靠具体类的继承来实现。对于大型项目来说,对象都是由基本的抽象类继承实现,而这些类的方法通常都由接口来定义。 原文地址:PHP设计模式(二):抽象类和接口 Introduction 对于编程来说,对事物的抽象是一个老生常谈的话题,抽象问题更利于面向对象编程以及程序设计模式。和C/C++,Java,Python等语言一样,PHP也支持面向...

    xialong 评论0 收藏0

发表评论

0条评论

wow_worktile

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<