一、接口的使用和重写
同一个接口可以有多个不同的实现类,但每一个实现类都必须重写接口中所有的抽象方法。即接口不考虑这些实现类各自采用什么方式实现这些功能,但它要求所有的实现类都必须有这些功能。
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 {
@Override
public int add(int a, int b) {
return a + b;
}
@Override
public int sub(int a, int b) {
return a - b;
}
@Override
public long mul(int a, int b) {
return a * b;
}
@Override
public 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() {
@Override
public 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";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//获取数据
public void readData(View view) {
readDataService service = new readDataService(this);
service.getData();
}
@Override
public void onSuccess(String data) {
//成功处理数据更新ui
}
@Override
public void failure() {
//弹框提示失败
}
}