Java的接口和抽象类到底哪个更抽象

举报
周杰伦本人 发表于 2022/11/29 18:15:37 2022/11/29
【摘要】 Java的接口和抽象类到底哪个更抽象 抽象类抽象方法是是不完整的方法,,它只是进行了声明,没有具体的方法实现逻辑,具体的实现逻辑由子类来完成。包含抽象方法的类是抽象类,通过abstract关键字来修饰抽象方法:abstract void function(); 接口接口相比抽象类,可以说它比抽象类更加抽象,抽象类可能还有具体的实现方法,而接口没有任何的具体实现方法,它只定义方法的参数类型,...

Java的接口和抽象类到底哪个更抽象

抽象类

抽象方法是是不完整的方法,,它只是进行了声明,没有具体的方法实现逻辑,具体的实现逻辑由子类来完成。包含抽象方法的类是抽象类,通过abstract关键字来修饰

抽象方法:

abstract void function();

接口

接口相比抽象类,可以说它比抽象类更加抽象,抽象类可能还有具体的实现方法,而接口没有任何的具体实现方法,它只定义方法的参数类型,方法名和返回类型。接口的所有的方法都是public类型的,否则编译器会报错。

接口与接口可以存在继承关系,从而实现接口的组合。

接口与设计模式

接口的高度抽象让它在设计模式中得到了发挥。策略模式经常会用到接口。以Scanner为例子,我们都知道,它是一个输入内容的类,我们看一下它的构造方法:

public Scanner(Readable source) {
        this(Objects.requireNonNull(source, "source"), WHITESPACE_PATTERN);
    }

构造方法的一个参数是Readable,Readable是一个接口,只要我们实现这个接口,就可以自定义输入的内容,

比如我们定义了一个类XppWords:

public class XppWords implements Readable {
  
   
  public int read(CharBuffer cb) {

    return 66; 
  }

只要实现Readable接口,并重写read()方法皆可以。

在使用这个类的时候:

  public static void main(String[] args) {
    Scanner s = new Scanner(new XppWords());
    while(s.hasNext())
      System.out.println(s.next());
  }

通过调用Scanner的构造方法创建对象,参数传的是Readable接口的实现类实例就可以输入内容,这就是接口的好处。

如果我们定义的类无法实现这个接口呢?还有一个办法是使用适配器模式,通过一个被适配来进行过渡。

适配器模式通常三个角色,一个是源角色,也就是系统中已经存在的,但与所需接口不匹配,一个是目标角色,也就是我们的Readable接口,这是我们需要的,还有一个就是适配器角色,通过它来转换过渡。

需要适配的类,也就是源角色:

public class Xpp {
    public int next() { return 66; }

    
  }

适配器类:

public class XppAdapter extends Xpp implements Readable {
  
  public int read(CharBuffer cb) {
    return next();
  }  
  
}

它是Xpp的子类又是Readable的实现类,

使用:

public static void main(String[] args) {
    Scanner s = new Scanner(new XppAdapter());
    while(s.hasNextDouble())
      System.out.print(s.nextDouble() + " ");
  }

通过构造XppAdapter对象调用Scanner的构造方法就可以创建Scanner对象了。

总结

这篇文章我们讲了Java的接口和抽象类,抽象类可能有具体的方法实现,接口比抽象类更加抽象,它全是方法的定义,没有具体实现,具体实现需要具体类来实现接口,接口的出现在设计模式中大放异彩,我们以适配器模式为例讲了接口的使用。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。