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的接口和抽象类,抽象类可能有具体的方法实现,接口比抽象类更加抽象,它全是方法的定义,没有具体实现,具体实现需要具体类来实现接口,接口的出现在设计模式中大放异彩,我们以适配器模式为例讲了接口的使用。
❤️ 感谢大家
如果你觉得这篇内容对你挺有有帮助的话: