【java入门点滴】向上转型与向下转型

向上转型:

  简单理解就是由 子类--->基类 转换的过程。在此过程中,唯一发生的事情就是“子类新增方法的丢失”。我个人理解这个过程是:子类--①-->基类--②-->子类(阉割版),父类引用指向了子类对象。

  在过程 ①,会把子类扩展新增方法给丢弃掉;

  在过程 ②,通过“后期绑定(多态)”,检测到子类对象;但是,需要注意的是:如果基类中有方法,而子类中并没有重新实现,那么依然会调用基类中的方法;具体参看下面的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 》第四版

posted @ 2016-04-19 17:40  iMhager  阅读(206)  评论(0编辑  收藏  举报