一、接口回调
接口回调: 接口属于引用型变量。可以把使用实现了某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。看下面示例。
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 P150 {
public static void main(String[] args) {
ShowMessage sm; //声明 接口变量
sm = new TV(); //接口变量 中 存放对象的 引用
sm.显示商标("长城牌电视机。"); //接口回调
sm = new PC(); //接口变量 中 存放对象的 引用
sm.显示商标("联想奔月PC机。"); //接口回调
}
}
二.对象的上转型对象
假设Animal类是Tiger类的父类,当子类创建一个对象,并把这个对象的引用放到父类对象中时,eg:
Animal a;
a = new Tiger();
或:
Animal a;
Tiger b= new Tiger();
a = b ;
这时,我们就说a是对象b的上转型对象。
对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性 和 功能(上转型对象相当于子类对象的一个“简化”对象)。
上转型对象的特点:
- 上转型对象不能操作子类新增的成员变量,不能调用子类新增的方法。
- 上转型对象可以访问子类继承 或者 隐藏的成员变量,也可以调用子类继承的方法或者子类重写的实例方法。
- 上转型对象操作子类继承的方法 或者 子类重写的实例方法,其作用等价于子类对象去调用这些方法。
class 类人猿 {
void cryspeak(String s) {
System.out.println(s);
}
}
class People extends 类人猿 { // 继承
void computer(int a,int b) {
int c =a*b;
System.out.println(c);
}
void cryspeak(String s) {
System.out.println("---"+s+"---");
}
public class P127{
public static void main (String arg[]) {
类人猿 monkey;
People p = new People();
monkey = p; // monkey是People对象p的上转型 对象
//上转型后 monkey就调用了 子类继承并且重写的cryspeak()方法
monkey.cryspeak("I love this game"); //等同于p.cryspeak("I love this game");
People people =(People)monkey; //把上转型对象 强制转化 为子类的对象
people.computer(10, 10);
}
}
上述例子,上转型对象monkey调用方法:
monkey.cryspeak("I love this game");
输出的结果是“- - - I love this game- - -”,而不是“I love this game”。因为monkey调用的是子类重写的方法cryspeak。
需要注意的是:
monkey.computer(10, 10);
是错误的,因为computer方法是子类新增的方法。
3.Java中的跨类引用
在java里面,关于跨类引用,有两条规则应该记住:
<1>、如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。这是向上转型的情形。
<2>、如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。这是接口回调的情形。
在java里面,向上转型是自动进行的,但是向下转型却不是,需要我们自己定义强制进行.
class B extends A{}
public class 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)父类方法的情形。