this is called object reference assignment conversion.
note:
"file" must be a subclass of the "read"
you can find something useful in a book "complete java 2 certification study guide"

解决方案 »

  1.   

    這是虚拟函数的问题:
    read rf=new file(); 
    这样声明的是:rf是指向file对象的read指针,其本质是read对象,不管你用什么对象实例化你的指针,  关键是他原来是什么类型,就调用谁的方法.
    read rf=new read();这样有错误吗?
      

  2.   

    上面的描述是VC的,在JAVA里应该如此:
    rf是read对象,其本质是read对象,但是是用其子类构造方法实例化的,因此他可以引用在其超类的方法和成员,但不能引用在其子类中新的成员,关键是他原来是什么类型,就调用谁的方法.
      

  3.   

    我调试了一下。实际上,read类里面的i和i是完全不同的东西,你说明成什么类型,他就调用谁的成员变量,这是和method完全不同的
    所以说这样是很恶劣的写法,这个例子是提醒你注意这个问题的: 不要试图重载父类的变量;一定要避免和父类或者祖先的变量同名。当初我维护扫毒引擎的时候就有很多这样的bug,头疼的一塌糊涂
      

  4.   

    你试试下面的,结果上面一行是1,下面一行是3。这说明了成员变量和方法的本质区别。
    package untitled1;
    import java.io.*;
    public class ButtonTest
    {
        public static void main(String[] args)
        {
            read rf=new file();
            System.out.println(rf.i);
            System.out.println(rf.getI());
        }
    }
    class read
    {
        public int i=1;
        int getI(){
          return 1;
        }
    }
    class file extends read
    {
        public int i=3;
        int getI(){
          return 3;
        }
    }
      

  5.   

    楼上的read rf=new read();肯定错误你说的java思想就是JAVA的“多态性”
    派生类的对象FILE可以直接赋予他的父类READ对象
    当调用重贼的int i时,系统将根据实际实例的对象动态联编
    表现在这里:read rf=new file();//实例的FILE对象赋予READ对象
            System.out.println(rf.i);//调用READ对象的i
    因此最后的输出结果是1
    怎么样解释的还够清楚吧:)
      

  6.   

    那为什么不用file rf=new file();
      

  7.   

    vive()说的对。以前没有注意成员变量不可重载。to cuke(wowo):
    用父类的句柄指向子类的对象,是为了实现动态绑定。即我们在调用父类句柄的方法时,我们不知道(也不想知道)它是哪个子类的对象,java会自己在运行时去调用它子类对象的方法。这在我们设计类结构良好,易于扩展等等。多型是OO的一种基本特征。我说的不行。
    你看看关于java多态性的教程或帮助,就清楚了。
    呵呵。