一、接口的使用和重写
同一个接口可以有多个不同的实现类,但每一个实现类都必须重写接口中所有的抽象方法。即接口不考虑这些实现类各自采用什么方式实现这些功能,但它要求所有的实现类都必须有这些功能。
1:首先定义一个计算器的接口
public interface Calculator {/** 两个数的和 int类型返回值*/int add(int a, int b);/** 两个数的差 int类型返回值*/int sub(int a, int b);/** 两个数的积 long类型返回值*/long mul(int a, int b);/** 两个数的商 float类型返回值*/float div(int a, int b);
}
2:定义一个实现该接口的类,该类可以多种(BCalculator,CCalculator,DCalculator等),接口其中一个作用是规范。
public class ACalculator implements Calculator {@Overridepublic int add(int a, int b) {return a + b;}@Overridepublic int sub(int a, int b) {return a - b;}@Overridepublic long mul(int a, int b) {return a * b;}@Overridepublic float div(int a, int b) {return (float) a / (float) b;}
}
3:调用接口
//实列话的是ACalculator,也可以实列化BCalculator,CCalculator,DCalculator等,实列化哪个调用哪个逻辑,返回哪个逻辑的结果
Calculator calculator = new ACalculator();int sum = calculator.add(11, 11);//sum ==22
接口的意义:这样写有什么好处呢?直接写逻辑不用接口不是更省事吗?是的,单人小功能开发没有问题。多人开发复杂功能这样可以标准一下协议,解耦算法和逻辑,提高多人开发的效率。
二、接口的回调问题
一般情况下主线程是不执行耗时任务的,如果遇到一些耗时任务(如网络请求,文件读写,数据库读写等等),我们会将其放入子线程中去执行,当执行完毕后,子线程再将执行结果返回给主线程。这个过程就是回调。
1:定义一个读取数据的回调接口
public interface OnReadDataCallback {/** 获取信息成功 */void onSuccess(String data);/** 获取信息失败 */void failure();
}
2:定义一个用于获取信息的任务类
public class dataService {private OnReadDataCallback callback;public dataService(OnReadDataCallback callback) {this.callback = callback;}public void getData() {// 模拟一个耗时操作Thread thread = new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(5000);// 读取成功callback.onSuccess("结果是:" + new Date());} catch (InterruptedException e) {// 读取失败callback.failure();}}});thread.start();}
}
3:回调使用
public class MainActivity extends AppCompatActivity implements OnReadDataCallback {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}//获取数据public void readData(View view) {readDataService service = new readDataService(this);service.getData();}@Overridepublic void onSuccess(String data) {//成功处理数据更新ui }@Overridepublic void failure() {//弹框提示失败}
}