博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记今天把我绕晕的代码: 继承覆盖多态this
阅读量:2218 次
发布时间:2019-05-08

本文共 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被覆盖就调用子类的,没被覆盖就调用自己的.

原来是这样的. 如果有不正确或者理解偏了之处 ,尽请留言指正.

你可能感兴趣的文章
VLAN与子网划分区别
查看>>
Cisco Packet Tracer教程
查看>>
02. 交换机的基本配置和管理
查看>>
03. 交换机的Telnet远程登陆配置
查看>>
微信小程序-调用-腾讯视频-解决方案
查看>>
phpStudy安装yaf扩展
查看>>
密码 加密 加盐 常用操作记录
查看>>
TP 分页后,调用指定页。
查看>>
Oracle数据库中的(+)连接
查看>>
java-oracle中几十个实用的PL/SQL
查看>>
PLSQL常用方法汇总
查看>>
几个基本的 Sql Plus 命令 和 例子
查看>>
PLSQL单行函数和组函数详解
查看>>
Oracle PL/SQL语言初级教程之异常处理
查看>>
Oracle PL/SQL语言初级教程之游标
查看>>
Oracle PL/SQL语言初级教程之操作和控制语言
查看>>
Oracle PL/SQL语言初级教程之过程和函数
查看>>
Oracle PL/SQL语言初级教程之表和视图
查看>>
Oracle PL/SQL语言初级教程之完整性约束
查看>>
PL/SQL学习笔记
查看>>