zoukankan      html  css  js  c++  java
  • 接口回调和向上转型

    抄别人的,但为了自己掌握更加的踏实,所以复制到这里,拜谢原创!http://blog.csdn.net/u014025369/article/details/24707525

    接口回调是指:可以把使用实现了某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。看下面示例。
    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)父类方法的情形。

    个人理解,向下转型用的特别少,可能是因为java机制的原因,但作为初学者,接口回调的概念还是很抽象的,直到用到代理模式的时候才悄然大悟,再次感谢作者!

  • 相关阅读:
    【NOIP2016提高组】 Day1 T3 换教室
    【NOIP2016 Day1 T2】天天爱跑步
    web@前端--html,css,javascript简介、第一个页面(常用标签简介)
    MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)
    MySQL--pymysql模块
    MySQL--(了解)可能会用到的内置函数
    MySQL--详细查询操作(单表记录查询、多表记录查询(连表查询)、子查询)
    MySQL--表操作(约束条件foreign key关联表 多对1,多对多,1对1)
    MySQL--表操作(innodb表字段数据类型、约束条件)、sql_mode操作
    MySQL基本语句、存储引擎
  • 原文地址:https://www.cnblogs.com/duzjextjs/p/6044875.html
Copyright © 2011-2022 走看看