/** * Description: * 基类的引用变量可以只想基类的实例对象也可指向其子类的事来对象 * 接口的引用变量也可以指向实现类的实例对象 * 程序调用的方法在运行期才动态绑定 * 绑定指将一个对象调用和一个方法主体连接到一起,就是引用变量所指向的具体实例对象的方法,就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法 * 这种动态绑定实现了多态。只有方法有多条的概念 */ public class Test { /** * 首先new Sub()的时候会首先调用Base的构造方法。 * 在Base的构造方法中会调用print方法,按照上述多态的特性 * 此时实例化的是Sub类的对象,所以实际会调用Sub类中的print方法。 * 此时Sub类中的非静态变量 int num = 3; 尚未执行,所以输出 Sub.num=0; * 然后父类把在构造器中把num赋值为2 * 然后调用子类的构造方法 * 由初始化顺序:Sub中的非静态变量num初始化为3 * 然后调用子类的print方法输出Son.num=3 * 接着输出b.num * 而属性是没有多态概念的, 所以会输出2 * @param args */ public static void main(String[] args) { Base b = new Sub(); System.out.println(b.num); } } class Base { int num = 1; public Base() { this.print(); num = 2; } public void print() { System.out.println("Base.num = " + num); } } class Sub extends Base { int num = 3; public Sub() { this.print(); num = 4; } public void print() { System.out.println("Sub.num = " + num); } }