其目地都是抽象。通过访问父类或接口的方法(公共)达到一种对具体实现的封装。对于接口的使用者来说,不需要关心实现细节。提高内聚,降低不必要的耦合。接口回调是指:可以把使用实现了某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。看下面示例。

interface 
   
 People {
 
   
   
 void 
   
 peopleList();
 
}
 
 
 
 class 
   
 Student 
   
 implements 
   
 People {
 
   
   
 publicvoid 
   
 peopleList() {
 
      
 out 
 .println( 
 "I’m a student." 
 );
 
  
 
}
 
 
 
 class 
   
 Teacher 
   
 implements 
   
 People {
 
   
   
 publicvoid 
   
 peopleList() {
 
      
 out 
 .println( 
 "I’m a teacher." 
 );
 
  
 
}
 
 
 
 publicclass 
   
 Example {
 
   
   
 publicstaticvoid 
   
 main(String args[]) {
 
      
   
 // 
   
 声明接口变量
 
      
   
 new 
   
 Student(); 
   
 // 
   
 实例化,接口变量中存放对象的引用
 
      
   
 // 
   
 接口回调
 
      
   
 new 
   
 Teacher(); 
   
 // 
   
 实例化,接口变量中存放对象的引用
 
      
   
 // 
   
 接口回调
 
  
 
}
 
 
结果: 
 I’m a student. 
 
I’m a teacher. 
 再来看看向上转型(upcasting)的概念。


2.什么是向上转型[1]




Android 自定义接口回调 接口回调的定义_多态



Shape s=new Circle();

这里,创建了一个Circle对象,并把得到的引用立即赋值给Shape。通过继承,Circle就是一种Shape。



假设你调用基类方法(它已在导出类中被覆盖):



s.draw();

由于后期绑定(多态),将会正确调用Circle.draw()方法。



3.Java中的跨类引用



在java里面,关于跨类引用,有两条规则应该记住:



1)如果a是类A的一个引用,那么,a可以指向类A的一个实例。或者说指向类A的一个子类,这是向上转型的情形。



2)如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。这是接口回调的情形。



在java里面,向上转型是自动进行的,但是向下转型却不是,需要我们自己定义强制进行.



class               B               extends               A{}





publicclass               A {


                 publicstaticvoid               main(String[] argts){


            new               A();


            new               B();       //Upcasting向上转型


            new               B();


                    new               A();       //DownCasting向下转型,[注意]:此处(B)进行了强制转换!


  


}

4.向上转型与接口回调的区别



从实现了某接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。这些对象都可以调用基类型提供的方法,对于接口来说就是回调接口中的方法,对于父类来说就是调用父类的方法。当然在向上转型的情况下,还牵涉到子类重写(Override)父类方法的情形。