个人对继承与多态理解有限.所以请个位大人帮我解决一下...public class Temp {
  public static void main(String[] args) {
    Super sub = new Sub();
    System.out.println(sub.i);//主要是这个地方,为什么调用的是父类的变量而不是子类的.难道是对于变量时没有后期邦定?嗳个人能力不限只好请各位JAVA高手帮一下了.
    System.out.println(sub.getClass().getName());
    sub.plus(3);
    System.out.println(sub.i);
    sub.print();
    System.out.println(sub.i);
  }
}
class Super {
  public int i=0;
  void plus(int i) {
    this.i =3;
  System.out.println("Super's plus");
  }
  void print(){
    this.i=5;
  System.out.println("Super");
  }
}
class Sub extends Super {
  public int i = 1;
  void plus(int i) {
    this.i = i + 8;
  System.out.println("Sub's plus");
  }
  void plus(int i, int j) {
    this.i = i + j;
  }
}

解决方案 »

  1.   

    不过还得强调多态在编译的一点
    就是你在运用多态时,编译的时候JVM会根据你所定义的引用类型所在的类中是否定义了这个成员而确定编译是否正确
    比如说:(上题部分代码)
    public static void main(String[] args) {
    Super sub = new Sub();//创建一个子类类型Sub的对象,而引用类型是父类类型Suber
    System.out.println(sub.i);//这行要想编译通过,必须确保在父类类型中有成员变量i的定义所以根据上面的规则在运行时自然是调用父类的成员变量i
      

  2.   

    其实楼主完全是自己骗自己,声明一个super对象,非得起个容易混淆的名字:
    Super sub = new Sub();
    ^^^^^^^^^
    这样是不是清楚了?
    Super parent = (Super)(new Sub());成员的继承问题大家可以讨论一下。
      

  3.   

    首先谢谢大家了.个人感觉,对于gzpoplar(poplar)的说法更容易理解些,但lingwen20(▄︻┻┳═一)的说法更准确些.这里涉及到了"运行时类型识别".
    默认状态(和强制类型转换状态相区别)下,对象(sub)只能调用父类方法和父类变量(调用该子类方法时会出现编译期错误)。此种情况下,还有两种不同的情况:
               ▲被调用方法是被该子类覆盖的方法,这时其实是显式调用父类方法,实际上是调用该子类方法和该子类变量,这时父类变量不能被该方法修改,被修改的是该子类变量。(也就是后期绑定.)
               ▲被调用方法没有被该子类覆盖,这时是调用父类方法,父类变量可以被该方法修改。再次感谢所有回复的人.
      

  4.   

    这个问题,我已经专门研究过。
    Super sub = new Sub;
    这个叫做超类,Super声名一个对象sub是基于子类Sub的基础上创建的。
    sub可以使用的方法和变量:
    父类的成员变量和被覆盖的方法。附送:
    super();对象可以使用父类的所有方法和变量。this();可以访问父类和子类中所有的方法或变量(父类中的构造方法除外)。