Android interface(接口)详解

Android interface(接口)详解

Android interface(接口)详解

什么是接口接口的使用场景接口的实现写法

什么是接口

可以理解成一种特殊的类,由常量和抽象方法组成的特殊类; 接口不可以实例化;接口中的方法没有方法体;继承接口的类一定要实现接口中定义的方法。 例:

public interface InterfaceDemo {

int i = 10; //常量

void method1(); //方法(没有方法体)

int method2(); //方法(没有方法体)

}

接口的使用场景

多重继承 Java本身是不支持类的多重继承(多重继承是指一个类从多个类继承而来,即一个类拥有多个超类) 但一个类却可以实现多个接口,我们可以将一些抽象方法定义在接口中,使用继承多个接口的方法间接地达到多重继承的目的 例:

//第一个接口

public interface MyInterface1 {

void fly();

}

//第二个接口

public interface MyInterface2 {

void walk();

}

public class Bird implements MyInterface1, MyInterface2 { //通过implements关键字继承上述两个接口,多个接口用“,”分隔

private static final String TAG = "Bird";

@Override // 实现接口MyInterface1中的fly()方法

public void fly() {

Log.i(TAG, "I can fly"); // 可根据需求完成自己的方法体

}

@Override

public void walk() { // 实现接口MyInterface2中的walk()方法

Log.i(TAG, "I can walk"); // 可根据需求完成自己的方法体

}

}

定义一个规范 同一个接口可以有多个不同的实现类,但每一个实现类都必须重写接口中所有的抽象方法。 即接口不考虑这些实现类各自采用什么方式实现这些功能,但它要求所有的实现类都必须有这些功能。 例:

//定义一个计算器接口

public interface Calculator {

/** 计算器可以计算两个数的和 */

int add(int a, int b);

/** 计算器可以计算两个数的差 */

int sub(int a, int b);

/** 计算器可以计算两个数的积 */

long mul(int a, int b);

/** 计算器可以计算两个数的商 */

float div(int a, int b);

}

//该类实现了计算器接口,并填充了具体实现方法

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; //具体实现方法

}

}

//这个类中使用ACalculator中的方法。这里并不需要了解ACalculator是通过什么方式计算的,只需要了解Calculator接口中的相关方法定义即可。

Test.java

Test.java

public class Test {

public static void main(String[] args) {

Calculator calculator = new ACalcuAlator(); //接口赋值(ACalcuAlator类中已经实现了Calculator接口)

int sum = calculator.add(12, 14); //相当于调用ACalcuAlator中的add()方法

System.out.println("sum = " + sum);

}

}

回调 回调就是把方法的定义和功能实现分开的一种机制 例:

//定义一个接口

public interface OnListener {

public void onClick(String msg);

}

class Test {

private OnListener onListener ; //定义一个的接口类型的变量存储数据

//在合适的位置调用接口里面的方法,传递数据

public void callBack(string msg) {

if (onListener != null) {

onListener .onClick(msg);

}

}

//创建一个公共的方法,让外部调用,并且传递接口类型的参数,给其定义的接口类型的数据初始化

public void setOnListener(OnListener onListener) {

this.onListener= onListener;

}

}

public class Activity {

Test test;

test.setOnListener(new Test.OnListener () {

@Override

public void onClick(msg) {

//使用传回的值

}

});

}

接口的实现写法

//定义接口

public interface OnKeyValueListener {

void getKeyValueClick(String value);

}

public class MyButton {

public MyButton(Context context) {

}

private OnKeyValueListener mOnkeyValueListener; //声明OnKeyValueListener接口对象

//接口中的方法赋值(传递需要的数据)

public void doClick() {

if (mOnkeyValueListener!= null) {

mOnkeyValueListener.getKeyValueClick("点击了A");

}

}

public void setmOnkeyValueListener(OnKeyValueListener mOnkeyValueListener) {

this.mOnkeyValueListener = mOnkeyValueListener; //MainActivity 类中调用该方法,传入监听对象

}

}

implements形式

public class MainActivity extends Activity implements OnKeyValueListener{

MyButton myButton ;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

myButton = new MyButton(MainActivity.this);

myButton.setmOnkeyValueListener(this); //传递监听对象到A类

myButton.doClick(); //这里是调用A类中的方法,接受到A类传入的内容

}

@Override

public void getKeyValueClick(String value) {

Log.d("MyLog","######## value = "+value); //打印获取到的内容

}

}

内部类形式

public class MainActivity extends Activity{

MyButton myButton ;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

myButton.setmOnkeyValueListener(new MyButton.OnKeyValueListener () {

@Override

public void getKeyValueClick(String value) {

Log.d("MyLog","######## value = "+value); //打印获取到的内容

}

});

}

相关推荐