向上转型:
简单理解就是由 子类--->基类 转换的过程。在此过程中,唯一发生的事情就是“子类新增方法的丢失”。我个人理解这个过程是:子类--①-->基类--②-->子类(阉割版)
在过程 ①,会把子类扩展新增方法给丢弃掉;
在过程 ②,通过“后期绑定(多态)”,检测到子类对象;但是,需要注意的是:如果基类中有方法,而子类中并没有重新实现,那么依然会调用基类中的方法;具体参看下面的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 》第四版
时间: 2024-11-06 13:23:28