如下代码所示:
public class DBtest
{
    /**
     * @param args
     */
    public static void main(String[] args)
    {
      DT t = new T1();
      t.get();
    }} 
class DT
{
    public int i = 10;
    public void get(){set();System.out.println(this);System.out.println(this.i);}
    public void set(){}
}
class T1 extends DT
{
    public int i = 100;
    public void set(){System.out.println("T1.set " + this + "  " + this.i);}
}
两次打印的i的值不同,但i所对应的对象地址显示的却是同一个,为什么呢?

解决方案 »

  1.   

    那JVM在执行的时候到底是怎么调用这个变量的呢
      

  2.   

    RTTI机制能让JVM正确识别对象的类型,因此子类的属性和方法会隐藏父类中相同名称的属性和方法。而实际上对象中的父子类中的属性和方法都各有自己的内存空间,不会互相影响,而你所说的对象地址是一个统一的访问地址,上述代码已经明显调用到父类的get方法,当然就会调用就进入到父类的内存空间了,读取的i属性自然是父类的i,而set因为重写了,所以会调用到子类的set方法,该方法属于子类,自己在里面除非是用super来标识调用父类的方法,否则读取的就是set实现类的属性
      

  3.   

    支持3楼。
    至于地址为什么是相同的呢?JAVA中,对象名只是一个引用,用于指向具体的对象。在你的对象中,只有一个对象名t,this也就是指的它。所以当你打印this的地址的时候自然会是一样的,但它们具体指向的对象就是3楼所说的了,并不一致。