接口
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
两种含义:一,Java接口,Java语言中存在的结构,有特定的语法和结构;二,一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做“Java接口”,后者叫做“接口”。在java中,接口用关键字interface来表示,书写方法为:
public interface Listener{
void result();
}
而后面跟的接口名称,按照习惯以XX_Listener,也就是监听器的意思。
在Java语言规范中,一个方法的特征仅包括方法的名字、参数的数目和类型,而不包括方法的返回类型、参数名以及所抛出来的异常。在Java编译器检查方法的重载时,会根据这些条件判断两个方法是否是重载方法。但在Java编译器检查方法的置换时,则会进一步检查两个方法(分处超类型和子类型)的返还类型和抛出的异常是否相同。
接口实现和类继承的规则不同,为了数据的安全,继承时一个类只有一个直接父类,也就是单继承,但是一个类可以实现多个接口,接口弥补了类的不能多继承缺点,继承和接口的双重设计既保持了类的数据安全也变相实现了多继承。
抽象类
Java语言中,用abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。在面向对象领域,抽象类主要用来进行类型隐藏。
在抽象类中可以包含一般方法和抽象方法。抽象方法的定义与一般方法不同,抽象方法在方法头后直接跟分号,而一般方法含有以大括号框住的方法体。所有的抽象方法必须存在于抽象类中。
区别
- Java抽象类可以提供某些方法的部分实现,而Java接口不可以;
- 向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点;
-
一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性;
任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。
使用
在同步方法中,可以在方法体内按顺序执行代码得到结果并通过return返回,这类方法一般不用于计算,只是算力简单的代码;
如果算力复杂,需要消耗比较长的时间,则用异步方法,不直接返回结果,而且等待计算完成之后,回调结果。
public class Demo {
public static String reverseStrSync(String src) {
StringBuilder temp = new StringBuilder();
temp.append(src);
temp.reverse();
return temp.toString();
}
public static void reverseStrASync(String src, ResultListener resultListener, Result result) {
new Thread(new Runnable() {
@Override
public void run() {
StringBuilder temp = new StringBuilder();
temp.append(src);
temp.reverse();
if (resultListener != null) {
resultListener.reverse(temp.toString());
}
if (result != null) {
result.reverse(temp.toString());
result.reverse2(temp.toString());
}
}
}).start();
}
public interface ResultListener {
void reverse(String dst);
}
public abstract static class Result {
abstract void reverse(String dst);
void reverse2(String dst) {
System.out.println("reverse2 = " + dst);
}
}
public static void main(String[] args) {
reverseStrASync("abcd", new ResultListener() {
@Override
public void reverse(String dst) {
System.out.println("ResultListener reverse = " + dst);
}
}, new Result() {
@Override
void reverse(String dst) {
System.out.println("Result reverse = " + dst);
}
});
}
}
运行结果