<p>关于多态:Father f=new Son();要记住的无非
<ol>
<li>静态变量和方法:编译和运行看左边(父类)</li>
<li>成员变量:编译和运行看左边</li>
<li>成员方法:编译看左边,运行看右边</li>
</ol>
</p>
<p>关于这些的理解找了网上的一些东西</p>
<h4>(1)静态和动态绑定机制(static binding and auto binding)</h4>
<p>静态绑定是指在编译期间JVM就确定了变量的值或者具体的方法的机制,而动态绑定是在运行时根据具体在堆中创建的对象JVM进行确认的。所有的成员变量,静态方法,final方法以及private修饰的方法(其实private默认带final)都采用的是静态绑定机制,而成员方法采用的是动态绑定。具体情况就是编译阶段进行类的加载时,会将各种静态放入方法区,各种常量以及方法名称和final方法放入常量池,然后会构造一个方法表,每个类都有一个方法表,是在编译的时候就确认的,放置着方法和其在方法区位置的对应关系,这个就是动态绑定机制的实现关键,顺序根据从父到子的顺序放置,如果出现重写方法(overwrite)则直接改变其地址。所以在编译时,如果father没有该方法,则father类的方法表中无此记录,调用则会发生编译错误(编译并未创建对象根据数据类型判断),所以编译看左边,而运行时,f为son的引用,调用方法时JVM根据f引用找到位于堆区的son对象,然后找到son类的方法表,调用方法,所以运行看右边。</p>
网友评论