zoukankan      html  css  js  c++  java
  • 【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 》第四版

    点滴积累,每天进步一点点!O(∩_∩)O~
  • 相关阅读:
    Qt新建线程的方法(有QRunnable,QThreadPool,moveToThread和QtConcurrent的例子)
    QThread 与 QObject的关系(QObject可以用于多线程,可以发送信号调用存在于其他线程的slot函数,但GUI类不可重入)
    Qt线程QThread简析(8个线程等级,在UI线程里可调用thread->wait()等待线程结束,exit()可直接退出线程,setStackSize设置线程堆栈,首次见到Qt::HANDLE,QThreadData和QThreadPrivate)
    QSettings保存程序设置
    QList 和std::list的比较
    转义字符()对JavaScript中JSON.parse的影响
    自定义类似QMutexLocker的CMutexLocker
    部件之间图标拖拽(使用很直观,效果很漂亮)
    QtSoap调用Web Service(QtSoap是非官方应用)
    QTableWidget 导出到csv表格
  • 原文地址:https://www.cnblogs.com/hager/p/5409109.html
Copyright © 2011-2022 走看看