本文共 905 字,大约阅读时间需要 3 分钟。
代码是出自李兴华的<<java开发实战经典>>
但看到这里我就晕了
当Person中的print因为是private权限而没被覆盖时 打印Person->>print ,当改成默认权限被覆盖时,打印Student->> print .
我就去百度知道上提问了:
http://zhidao.baidu.com/question/1603770456429560027.html?quesup2&oldq=1
有个人给我解释说:
this关键字指的是当前对象,person中的print()是private的,不被子类继承的,子类中的print()和它无关,new Student().fun() 后,fun()方法子类中没有,会到person中找,person中有,执行person中的this.print()方法,此时当前的this当然是person,它在调用print()时,print是private的,不会被子类重写,所以打印persong----....... 当改person中的print()权限private为public后,执行到this.print()时,调用子类print() print()被重写,这是父类引用指向子类对象,打印就是子类的print().
我对他的回答的理解是:
this是一个地址指向当前对象.Person中的shis其实是(Person)this , Student中的this其实是(Student)this. 父类fun中的this->print() 其实可以看做是Person p=new Student(); p->print(); 这是一个向上转型 根据多态特性: 1父类只能调用父类中定义的方法. 2父类方法只能在父类中定义而子类中没有重写的时候调用. (解释情形一) 3父类方法被子类重写时调用子类方法.(解释情形二). 或者如我的另一个同学所说:
其实this并不重要,this本来就是可以省略的. 调用fun函数就去查虚函数表,如果print被覆盖就调用子类的,没被覆盖就调用自己的. 原来是这样的. 如果有不正确或者理解偏了之处 ,尽请留言指正.