A extends B 
B a = new A()
与A a = new A()B a = new A()时:
调用属性时,加入A和B中都定义了value属性;
在B中public int value = “B”;
在A中public int value = “A”;
则调用a.value 得到“B”;
调用方法时调用类A中的方法。而A a = new A()时:
属性和调用方法均是类A中的。

解决方案 »

  1.   

    A a = new A() 这是new一个A的对象,a拥有A的public方法,如果在同一个包中还拥有Protect方法A extends B B a = new A()
    这里的B继承了A,B可以继承A的方法,可以重写A的方法(多态)
      

  2.   

    对于类的属性来说,是前期绑定;
    而对于类的方法来说,是后期绑定;
    来看代码:/**
     * @author bzwm
     * 
     */
    public class TestExtends { public static void main(String args[]) { Father f = new Child();
    //类的属性是前期绑定,所以这里输出“Father”;
    System.out.println(f.var);
    //f的类型是Father,但是,却用Child的构造方法初始化的,所以引用指向Child;
    //所以执行Child的getVal()方法,所以 return this.val,就输出子类了。
    System.out.println(f.getVal());
    }
    }class Father { String var = "Father"; String getVal() {
    return var;
    }
    }class Child extends Father { String var = "Child"; String getVal() {
    return var;
    }
    }
    当一个对象被实例化,它的父类会先被实例化,
    实例化其实是对对象的成员变量的初始化;
    在对象中有个隐藏的属性super,指向它的父类的对象,还有个隐藏的属性this指向对象本身;
    类的方法,在类被加载的时候被加载到了方法区,
    同个类的所有对象都持有相同的方法指针,
    在java中,所有的方法都是后期绑定,
    即动态绑定,
    如果在this中找到了调用的方法,就执行,若没有就在super中找,
    如果在this中没有,进入了super,则相当于this指向了super,你将无法再访问到原来的this里的属性和方法了,
    只能再向上。
    类的所有实例方法,在JVM执行它的时候,
    会把this和super两个属性压入方法栈中,
    若在方法的局部变量中找不到变量val,即val 不是局部变量,
    则就会去this对象中找,找不到了再到super中找。说的不太清楚,先看着吧。