关于java的接口回调和向上转型的理解

form:http://blog.csdn.net/centurymagus/article/details/4476456

晚上的时候正在思考接口和对象转型若干问题,上网查了下资料,感觉这个解释的非常好,所以就转了过来,以备以后查找,也发出来给大家学习学习.

接口回调是指:可以把使用实现了某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。看下面示例。
interface People { 
    void peopleList(); 

  
class Student implements People { 
    publicvoid peopleList() { 
       System.out.println("I’m a student."); 
    } 

  
class Teacher implements People { 
    publicvoid peopleList() { 
       System.out.println("I’m a teacher."); 
    } 

  
publicclass Example { 
    publicstaticvoid main(String args[]) { 
       People a; // 声明接口变量 
       a = new Student(); // 实例化,接口变量中存放对象的引用 
       a.peopleList(); // 接口回调 
       a = new Teacher(); // 实例化,接口变量中存放对象的引用 
       a.peopleList(); // 接口回调 
    } 

 

I’m a student.
I’m a teacher.
再来看看向上转型(upcasting)的概念。


2.什么是向上转型?

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){ 
       A a1=new A(); 
       A a2=new B();//Upcasting向上转型 
       B b1=new B(); 
       B b2=(B) new A();//DownCasting向下转型,[注意]:此处(B)进行了强制转换! 
    } 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值