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

1 .接口回调是什么

接口回调是指:可以把使用实现了某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。看下面示例。
interface People {
    void peopleList();
}
 
class Student implements People {
    public void peopleList() {
       System. out .println( "I’m a student." );
    }
}
 
class Teacher implements People {
    public void peopleList() {
       System. out .println( "I’m a teacher." );
    }
}
 
public class Example {
    public static void 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{}
 
public class A {
    public static void main(String[] argts){
       A a1= new A();
       A a2= new B(); //Upcasting
       B b1= new B();
       B b2=(B) new A(); //DownCasting
    }
}
4 .向上转型与接口回调的区别
从实现了某接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。这些对象都可以调用基类型提供的方法,对于接口来说就是回调接口中的方法,对于父类来说就是调用父类的方法。当然在向上转型的情况下,还牵涉到子类重写( Override )父类方法的情形。
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
接口也可以进行向上转型和向下转型。向上转型是指将一个实现了某个接口的类的对象赋值给该接口类型的变量。这样做的好处是可以实现多态,即通过接口类型的变量调用实现类中的方法。向下转型是指将一个接口类型的变量强制转换为实现类类型的变量。但是需要注意的是,向下转型只能在原本就是该实现类对象通过向上转型得到的情况下才能成功转型。在进行向下转型之前,可以使用instanceof关键字判断某个对象是否是某个接口的实例。这样可以避免在转型时出现ClassCastException异常。总的来说,接口的向上转型和向下转型与类的转型类似,都是为了实现多态性和灵活使用不同的实现类。 #### 引用[.reference_title] - *1* *2* [java --向上转型和向下转型](https://blog.csdn.net/dj1540225203/article/details/124122278)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [详细解析Java多态、向上转型、向下转型](https://blog.csdn.net/m0_54158068/article/details/124903372)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值