一个java关于对象转型的问题,请高手们帮忙解答下啦!代码如下:为什么注释的哪行有问题,p这个引用变量指向了Student这个实例,那不是应该有了Student类里面的school这个变量么??而p.say()为什么执行的时Student里面的say()方法呢?是不是因为内存分配的问题。
class Person 
{
String name;
void say(){System.out.println("peron");};
}
class Student extends Person
{
String school="gdpu";
void say(){System.out.println("student");}
public static void main(String[] args) 
{
Person p = new Student();
p.name="hh";
Student s=(Student)p;
//System.out.println(p.school);
System.out.println(s.school);
p.say();
}
};

解决方案 »

  1.   

    问题在于p声明为了Person,而Person没有school这个方法
      

  2.   

    LZ找些资料好好看看方法重写和多态吧
    Student类重写父类的方法
    Person p = new Student(); //p指向Student类的实例
    方法是动态绑定的,指向什么实例就调用什么实例的重写过的方法,也就是方法调用的时候,会先从虚拟表V-Table查找方法的地址,再调用方法,p指向Student的实例,从V-Table中找到了Student的方法
      

  3.   

    属性是静态绑定的,也就是编译期决定的
    p是Person类,没有school属性,所以静态绑定失败