先来看看定义:
向上转型(upcasting):子类引用的对象转换为父类类型称为向上转型。
Father f= new Father();
son s=new son();
f=s; //Father f= new Son();
有以下特点:
1、只能调用父类的成员(除private成员),如果子类重写了父类的方法就根据这个引用指向调用子类重写的这个方法(这个方法就是覆盖override)。这个调用过程就称为“动态绑定”。
2、实际上是子类的内存空间
向下转型(downcasting):父类引用的对象强制转换为子类类型称为向下转型。
Father f= new Son();
son s=(son)f;
//Father f= (son)new Father();
子类引用不能指向父类对象,但此时f为父类指向子类的对象,故可以。否则出现异常,可以通过instanceof来防止出现异常。
1、只能调用子类的成员(除private成员)
2、实际上是父类的内存空间
那么向上转型的意义呢?
另外,这里说到的强制转换在类型上也是同样的道理:
字节数: 1 2 2 4 4 8 8
这里,子类重写父类方法时,需要注意以下几点:
还有,这里的instanceof运算符:
回调方法就是一个通过方法指针来调用的方法。如果我将这个方法的指针(地址,引用)通过形参传递到另一个类的某个方法里,那么当这个类调用该方法里面我所传入的指针时,就能调用我这边的方法。
接口回调理解就是:类A中调用B类的中方法C,而B又反过去调用A中的方法D,然后D称为A的回调方法,类C称为中转方法。
注意:中转方法必须有调用回调方法的代码块,中转方法可以不传递对象参数。
接口回调:引用类的对象转换为接口类型
有两种情形:
1,共2个类,类A实现接口,类B实现回调,中转方法 C传递接口对象
(整个过程就是A调用方法C并传送A的对象,B接收,并在某个时刻(异步)用该对象回调A这边的D方法。)
2,共三个类,其中一个匿名内部类仅仅实现对接口的重写。(常用)
(整个过程就是A实例化B并传递内部类对象,调用方法C。B接收,并在某个时刻(异步)用该对象回调内部类的D方法。)
那么问题来了,接口回调和向上转型的区别是什么?(网上搜索得到下面)
看似向上转型和接口回调是一回事。看下面两句话,均出自Thinking in Java。
使用接口的核心原因:
1、为了能够向上转型为多个基类型[1]。即利用接口的多实现,可向上转型为多个接口基类型(具体见《抽象与接口》章节6)。
从实现了某接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。(此句摘自Thinking in Java 3rd 接口与内部类一章)
向上转型对象不能使用子类新增成员(包括成员变量,成员方法),只能使用子类重写父类的方法,被子类隐藏的父类变量;子类未重写的父类方法,未被隐藏的父类成员变量.
那么问题来了,既然子类继承并且重写了父类的方法,那么直接产生一个子类的对象就可以调用重写的方法,上转型还有什么作用?
(引用于百度知道)
“这样可以更好的实现多态,设计模式中的工厂设计就是基于此的。比如设计一个父类FileRead,使用来读取文件的,设计ExcelRead和WordRead两个继承FileRead的子类。我们在使用程序的时候,往往事先不知道我们要读入的是Excel还是Word。所以我们向上转型用父类去接收,然后再父类中在实现自动绑定,无论你传进来的是Excel还是Word我都能够完成文件读取。”
同样的,还有接口外调:接口类对象强制转换为引用类类型
用于实现对重写类其它方法的调用,但是。。目前对它的使用场景未知,等待探索。
接口回调: