接口回调
借用C语言中指针回调的术语,表示一个变量的地址在某一个时刻存放在一个指针变量中,那么指针变量就可以间接操作该变量中存放的数据。
接口回调:可以把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法。实际上,当接口变量调用被类的接口方法时,就是通知相应的对象调用这个方法。
interface ShowMessage{
void 显示商标(String s);
}
class TV implements ShowMessage{
public void 显示商标(String s){
System.out.println(s);
}
}
class PC implements ShowMessage{
public void 显示商标(String s){
System.out.println(s);
}
}
public class Example03 {
public static void main(String[] arg){
ShowMessage sm; //声明接口变量
sm=new TV(); //接口变量中存放对象的引用
sm.显示商标("长城牌"); //接口回调
sm=new PC(); //接口变量中存放对象的引用
sm.显示商标("恋月"); //接口回调
}
}
接口与多态
不同的类在实现同一个接口时可能具有不同的实现方法。
public class Example04 {
public static void main(String[] args){
CompurerAverage computer;//定义接口
double a=11.23,b=22.78;
computer=new A1();
double result=computer.average(a,b);
System.out.println(a+"和%"+b+"的算术平方根:"+result);
computer=new B();
result=computer.average(a,b);
System.out.printf("%5.2f和%5.2f的几何平方根:%5.2f",a,b,result);
}
}
interface CompurerAverage{
public double average(double a,double b);
}
class A1 implements CompurerAverage{
public double average(double a,double b){
double aver=0;
aver=(a+b)/2;
return aver;
}
}
class B implements CompurerAverage{
public double average(double a,double b){
double aver=0;
aver=Math.sqrt(a*b);
return aver;
}
}
11.23和%22.78的算术平方根:17.005000000000003
11.23和22.78的几何平方根:15.99
接口参数
参数是接口类型,就可以将任何实现接口的类的实例的引用传递给该参数接口,那么参数接口就可以回调类实现的接口方法
public class Example05 {
public static void main(String[] a){
KindHello kind=new KindHello();
kind.lookHello(new China());
kind.lookHello(new English());
}
}
interface SpeakHello{
void speak();
}
class China implements SpeakHello{
public void speak(){
System.out.println("中国人习惯性问候语:你好");
}
}
class English implements SpeakHello{
public void speak(){
System.out.println("英国人习惯性问候语:Hello");
}
}
class KindHello{
public void lookHello(SpeakHello hello){//接口类型参数
hello.speak();//接口回调
}
}
中国人习惯性问候语:你好
英国人习惯性问候语:Hello
abstract类和接口的比较
- 都可以有abstract方法
- 接口中只可以有常量,不能有变量;
abstract类可以有常量也可以有变量。 - abstract类中可有非abstract方法,接口不可以
- 需要继承可使用接口类,不需要可使用abstract类
应用举例
public class InterExam {
public static void main(String[] args){
AdertBoard board=new AdertBoard();
board.show(new BlackLandCorp());
board.show(new WhiteCloudCorp());
}
}
interface Advert{
public void showA();
public String getCorpName();
}
class AdertBoard{
public void show(Advert advert){
System.out.println(advert.getCorpName()+"的广告如下:");
advert.showA();//接口的回调
}
}
class WhiteCloudCorp implements Advert{
@Override
public void showA() {
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@");
System.out.println("飞机中的战斗机~~~~~~~~");
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@");
}
@Override
public String getCorpName() {
return "白云有限公司";
}
}
class BlackLandCorp implements Advert{
@Override
public void showA() {
System.out.println("!!!!!!!!!!!!!!!!!!!!!");
System.out.println("劳动是爹\n土地是妈");
System.out.println("!!!!!!!!!!!!!!!!!!!!!");
}
@Override
public String getCorpName() {
return "黑土集团";
}
}
黑土集团的广告如下:
!!!!!!!!!!!!!!!!!!!!!
劳动是爹
土地是妈
!!!!!!!!!!!!!!!!!!!!!
白云有限公司的广告如下:
@@@@@@@@@@@@@@@@@@@@@@@@
飞机中的战斗机~~~~~~~~
@@@@@@@@@@@@@@@@@@@@@@@
.