ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

jvm静态分派和动态分派

2021-02-21 02:01:49  阅读:178  来源: 互联网

标签:静态 age System 分派 Son jvm println void out


package com.jvm.dispatch;

/**
 * @author JTY
 * @date 21-2-20 23:44
 * @description 
 * 静态分派 编译期间根据静态类型(外观类型)确定目标方法,典型的有方法重载
 * 方法动态分派 运行期间根据运行时类型(实际类型)确定目标方法,典型的有方法重写
 */
public class DynamicDispatch {
    static abstract class Human {
        abstract protected void sayHello();
    }

    static class Woman extends Human {
        @Override
        protected void sayHello() {
            System.out.println("hello woman!");
        }
    }

    static class Man extends Human {
        @Override
        protected void sayHello() {
            System.out.println("hello man!");
        }
    }

    /*** 验证字段没有多态性,子类字段覆盖父类字段 */
    static class Father extends Human {
        public int age = 40;

        public Father() {
            age = 50;
            showAge();
        }

        public void showAge() {
            System.out.println("I'm father,my age is " + age);
        }

        @Override
        protected void sayHello() {
            System.out.println("hello Father!");
        }
    }

    static class Son extends Father {
        public int age = 20;

        public Son() {
            age = 10;
            showAge();
        }

        public void showAge() {
            System.out.println("I'm Son,my age is " + age);
        }

        @Override
        protected void sayHello() {
            System.out.println("hello Son!");
        }
    }

    /*** 验证方法重载的静态分派 */
    static void printClassType(Human m) {
        System.out.println("this type is Human");
    }

    static void printClassType(Woman m) {
        System.out.println("this type is Woman!");
    }

    static void printClassType(Man m) {
        System.out.println("this type is Man!");
    }

    public static void main(String[] args) {
        Human m = new Man();
        //编译期间根据静态类型确定调用方法为 printClassType(Human m)
        printClassType(m);
        //运行期间根据实际类型确定调用方法为 Man::sayHello()
        m.sayHello();
        m = new Woman();
        //编译期间根据静态类型确定调用方法为 printClassType(Human m)
        printClassType(m);
        //运行期间根据实际类型确定调用方法为 Woman::sayHello()
        m.sayHello();

        //验证字段没有动态分派,当使用子类方法访问父类、子类同字段时,只会访问到子类的字段
        Son son = new Son();
        Father fa = son;
        /*
         * I'm Son,my age is 0    实际类型是Son,由于动态分派,父类Father构造方法中调用的showAge()为Son::showAge(),
         *                           访问到的属性为Son.age,由于父类的构造方法在子类初始化之前,此时访问到的为jvm默认的初始值0
         * I'm Son,my age is 10   子类的方法调用时age字段已经被赋值为10
         * hello Son!             方法具有多态性,调用实际类型的方法
         * son age is 10          Son类型的字段值
         * father age is 50       Father类型的字段值
         * */
        son.sayHello();
        /*** 此时使用静太类型访问到的父类中的字段值 */
        System.out.println("son age is " + son.age);
        /*** 此时使用静太类型访问到的子类中的字段值 */
        System.out.println("father age is " + fa.age);
    }
}

标签:静态,age,System,分派,Son,jvm,println,void,out
来源: https://www.cnblogs.com/jinit/p/14424027.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有