向上转型:
简单理解就是由 子类--->基类 转换的过程。在此过程中,唯一发生的事情就是“子类新增方法的丢失”。我个人理解这个过程是:子类--①-->基类--②-->子类(阉割版),父类引用指向了子类对象。
在过程 ①,会把子类扩展新增方法给丢弃掉;
在过程 ②,通过“后期绑定(多态)”,检测到子类对象;但是,需要注意的是:如果基类中有方法,而子类中并没有重新实现,那么依然会调用基类中的方法;具体参看下面的demo;
需要特别注意的是:“动态绑定”,不包含声明为private(private其实也被编译为了final标记)、static、final 的方法;这些方法都是属于 “前期绑定” 范畴;
而在java中,一般除了static、final方法外,都是 “动态绑定”的。
基类定义
// 基类定义
public class HumanService {
public HumanService() {
System.out.println("init HumanService.");
}
public void play() {
System.out.println("HumanService.play.");
}
public void run() {
System.out.println("HumanService.run.");
}
}
Men子类定义
//子类定义
public class MenService extends HumanService {
public MenService() {
// super();
System.out.println("MenService.init.");
}
public void play() {
System.out.println("MenService.play.");
}
/**
* 子类扩展自有方法
*/
public void happy() {
System.out.println("MenService.happy.");
}
}
Women子类定义
//子类定义
public class WomenService extends HumanService {
public WomenService() {
super();
System.out.println("women.init.");
}
public void play() {
System.out.println("WomenService.play.");
}
}
测试类:
public class MainService {
public static void main(String[] args) {
//直接实例化,无转型
MenService men = new MenService();
men.play();
System.out.println("============");
//直接实例化,无转型
WomenService women = new WomenService();
women.play();
System.out.println("============");
//将MenService向上转型为BaseHumanService
//向上转型,子类新增方法会丢失;但是基类方法仍会保留;
HumanService human = new MenService();
human.play();//human 此时,应该是MenService,因为通过后期绑定(多态)将对象转成了MenService,但是也是一个阉割版本的MenService;
System.out.println("============");
//upcase后,子类新增方法会丢失;所以没有happy方法可用
HumanService human2 = new MenService();
//human2.happy();//error
HumanService human3 = new MenService();
human3.run();
} }
输出结果:
init HumanService.
MenService.init.
MenService.play.
============
init HumanService.
women.init.
WomenService.play.
============
init HumanService.
MenService.init.
MenService.play.
//子类中没有重新实现基类方法,就会调用基类的方法
init HumanService.
MenService.init.
HumanService.run.
遗留问题:
在向上转型环节,“后期绑定(多态)”这个机制,还不了解;需要继续研究或者寻求高人指点。
向下转型:
向下转型,存在一定的安全风险。暂时不整理。等后续了解更多时,再逐渐补充。
=====================
参考:
《think in java 》第四版