Person stu=new Student();
Person是超类 Student是子类
stu和new Student()是一致的吗?而且stu属于Person类还是Student类?
我用程序测试的结果:
stu和new Student()不一致 不是同一个对象
stu是Person类而不属于Student类求高人指点!!!

解决方案 »

  1.   

    把程序贴出来看看你是怎么比较的吧如果你是:if (stu == new Student()) 肯定是不相等的,对象比较直接比地址,要相等除非是同一个对象。这种比较方式相当于:if (new Student() == new Student()) ,肯定不相等啊。
      

  2.   

    建议楼主去看看java多态的资料
      

  3.   

    Person stu是超类的句柄,不属于Student类
      

  4.   

    stu和new是同一个对象,你的比较方法不对
    stu是超类的引用,不属于子类,但可以指向子类的对象
      

  5.   

    stu是超类的引用,但是如果子类中覆盖超类中的方法,stu会调用子类中的方法
      

  6.   

    1.stu就是指向new Student。
    2.stu是父类Person的引用,但是真正在堆中是Student类型的,stu.getClass()拿到。
    3.stu这时候只能看到Person的那部分,看不到Student独用的那部分。
      

  7.   

    stu是父类的引用----》new Student对象
      

  8.   

    这好像有点像想多肽了吧!这样做可以使程序有最大的灵活性!当我们访问stu时只能访问Student中的重写Person的哪些方法对Person特有的方法通过stu是访问不了的!
    下面来说说灵活性:比如这次要调用Student中重写的Person的一些方法而下次又要调用Teacher中重写的Person的一些方法!这样只需要把原代码Person stu=new Student();改成Person stu=new Teacher();
    就行了其他的都可以不变!这就是这样写的好处!
      

  9.   

    stu这时候只能看到Person的那部分,看不到Student独用的那部分
    为什么呢?
      

  10.   

    Person stu = new Student() 这是多态,
    还有,Student继续Person类,那么Student is a Person.
      

  11.   

    java变量有两种类型,一种是声明类型,一种是实际类型。

    Person p = new Student();
    Person 是声明类型,Student是实际类型。p只能调用声明类型(Person)的方法和属性。Student特有的属性和方法被隐藏(隐藏,不是消失)
    但因为它实际类型是Student。所以,调用p的方法时,会去检查Student里有没有该方法,有的话,====================================
    这种理解对不对:编译期和运行期
    1、在编译期,声明类型起作用。p声明为Person类型,所以编译的时候,会检查p调用的属性,方法是不是p的,如果Person中不存在,报错。
    2、运行期,实际类型起作用。因为p的实际类型是Student。编译成class时的时候,p已经变成Student类型了。