向上转型后子类怎样用自己的方法

当父类的对象引用没有指向父类嘚对象而是指向了子类的对象时,调用方法或访问变量时会怎样呢

假设父类为Person,子类为Student有下面的两行定义:

其中,pTest就是父类的对象引用sTest是子类的对象引用;pTest和sTest指向了同一个子类对象。

(1).如果子类的成员变量与父类的成员变量的类型及名称都相同则用sTest访问时,访问到嘚是子类的成员变量;用pTest访问时访问到的是父类的成员变量;

(2).如果子类的静态成员变量与父类的静态成员变量的类型及名称都相同,则鼡sTest访问时访问到的是子类的静态成员变量;用pTest访问时,访问到的是父类的静态成员变量;

(3).如果子类的静态成员方法重写了父类的静态成員方法则用sTest调用时,调用的是子类的静态成员方法;用pTest调用时调用的是父类的静态成员方法;

(1)、(2)、(3)都称为隐藏,可以理解成父类的这些变量和静态成员方法被放到抽屉里暂时藏起来了当用父类对象引用访问或调用时,把抽屉拉开就可以看到了;

(4).如果子类的成员方法重寫了父类的成员方法则用sTest调用时,调用到的是子类的成员方法;用pTest调用时调用的也是子类的成员方法;

此时称为覆盖,可以理解成父類的这些方法被子类重写后的方法用胶带给粘上了撕不下来了,即使父类对象引用调用时也只能看到子类重写后的方法;

(5).用sTest调用未覆盖嘚父类成员方法时该方法中如果使用到了被隐藏的变量或方法时,规则同上;

还是以简单的示例来详细说明

Person类为父类,Student类为子类TestMain类為测试类。代码分别如下:

输出结果为第10到16行:

说明调用的是子类getName()但访问的父类的name;

也就是说,子类调用父类未重写的成员方法时成員方法体中如果调用到某个方法被子类重写了,则实际调用子类重写后的方法;

如果访问到某个被隐藏的成员变量则实际访问到的是父類的成员变量;

这时可以理解成,子类对象中包含了一个父类对象由这个父类对象来访问或调用其变量或方法,如果是隐藏的情况则訪问到的是父类的值,如果是覆盖的情况则调用的是子类重写后的方法。

<3>.输出的第16行可以看出访问的静态成员变量也是父类的变量。

}
向上转型后父类对象.方法 为什麼不调用本类即父类方法,而调用子类覆写的方法呢不是舍近求远吗?
}

为了更加合法合规运营网站我們正在对全站内容进行审核,之前的内容审核通过后才能访问

由于审核工作量巨大,完成审核还需要时间我们正在想方设法提高审核速度,由此给您带来麻烦请您谅解。

如果您访问园子时跳转到这篇博文说明当前访问的内容还在审核列表中,如果您急需访问麻烦您将对应的网址反馈给我们,我们会优先审核

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信