Java中动态绑定与Try finally中有return的理解

来源:互联网 发布:python与量化投资 编辑:程序博客网 时间:2024/06/04 18:24

Java中动态绑定与Try finally中有return的理解



看代码:

/** * 类说明 *  * <pre> * Modify Information: * Author        Date          Description * ============ =========== ============================ * DELL          2017年9月12日    Create this file * </pre> *  */public class TestSupperClass {    /**     *      * 类说明     *      * <pre>     * Modify Information:     * Author        Date          Description     * ============ =========== ============================     * DELL          2017年9月12日    Create this file     * </pre>     *     * 动态绑定: 后期绑定:在运行时根据具体对象的类型进行绑定。     * 若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法     * 。也就是说,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查     * ,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象中安插某些特殊类型的信息。     * 动态绑定的过程: 1.虚拟机提取对象的实际类型的方法表; 2.虚拟机搜索方法签名; 3.调用方法。     */    static class Father {        protected String name = "父亲属性";        public String getName() {            return name;        }    }    static class Son extends Father {        protected String name = "儿子属性";        public String getName() {            return name;        }        // public static void main(String[] args) {        // Father sample = new Son();        // System.out.println("调用的属性:" + sample.getName());        // }    }    static class A {        public A(int v) {            setValue(v);        }        protected int value;        /**         * @param v         */        public void setValue(int v) {            this.value = v;        }        public int getValue() {            try {                value++;                return value;            } finally {                this.setValue(value);                System.out.println(value);            }        }    }    static class B extends A {        public B() {            super(5);            setValue(getValue() - 3);        }        public void setValue(int v) {            super.setValue(2 * v);        }    }    /**     * @param args     */    public static void main(String[] args) {        // System.out.println(new B().getValue());        /*         * 执行过程 super(5) setValue在子类B中有实现,其实实现的是子类的setValue()方法,此时 value = 10         * 然后setValue(getValue)先getValue 10+1 = 11 value = 11; 走finally         * 里面再次走setValue()子类的setValue() 11*2 = 22 打印22 return 的是11 -3是8         * 再次setVale 子类的setValue 8*2= 16 再次getValue 16+1 = 17 17*2 = 34 打印 34 最后         * 上面return 的是17 因此最后的结果是 22 34 17         */        Father sample = new Son();        System.out.println("调用的属性:" + sample.getName());        // 这个有两个考察点1. 是动态绑定 2.是return 与finally执行顺序        // 如果子类实现了父类的方法,判断了 是属于哪个类之后,会调用改类对应方法 Father sample = new        // Son();用的是子类的方法        // 但是 Father sample = new Father(); 那么调用 的是父类的方法 B中的setValue        // 调用的就是B中自己的setValue方法 2*v        // 对应 return finally 执行顺序,需要这样理解,程序先是把return 返回值放到        // 缓存中,然后再执行finally,finally修改不会影响该值    }}


阅读全文
0 0
原创粉丝点击