- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java中的多态和类型转换
Java中的多态
多态的进一步理解,多态可以理解为两个方面:
(1) 父类型的引用可以指向子类型的实例或对象,
(2) 接口类型的引用可以指向实现该接口的类的实例或对象(instance)。
由此来看,以后一提到多态,应该马上映射到向上转型。
接口就是一种特殊的抽象类,关键字interface,实现用implements。例如:结合数组定义:
interface Interface1 implements Bb
{
}
Interface1[] = new Interface1[]{Bb(),Bb()};//数组
对象的多态一般就是两种形态:父类形态与本类形态。
子类的对象就在这两种形态之间相互转换。
(1)向上转型是把子类对象转成父类形态,限制子类的特有方法;
(2)向下转型是把子类对象从父类形态转成本类形态(向下转型的前提是先进行向上转型)。
Parent p = new Child();(1)当使用多态的方式调用方法时,首先检查父类中是否有此方法,如果没有,则会出现编译出错,如果有则可编译通过,包括子类和父类都有此方法,子类的把父类的覆盖,调用的是子类中的此方法,如果子类中不存在此方法,直接调用父类的方法。因此编译时要看父类中是否存在此方法,调用时具体要看所指向对象的中的方法,先看子类方法的重写,若没有再调用从父类继承下来的方法。此规律仅限于成员方法。(2)*****对于成员变量,则只看引用所属类中是否有此变量,调用的也是父类中的变量值,与子类中的变量没有一点儿关系。
类类型的引用可以指向本类及其子类的对象;接口类型的引用可以用于指向实现接口的子类的对象。这就是多态的体现。
这样让父类引用或接口引用作为形参,就可以接收很多子类的对象,拓展性比较强。
多态:某一类事物的多种存在形态。
在java中多态的体现在:
(1) 父类的引用可以指向本类及其子类的对象;
(2)接口的引用可以指向实现此接口的类的对象。
多态的好处:可以提高代码的复用性,提高代码的扩展性,前期定义的代码可以使用后期的内容。
多态的弊端(局限性):前期定义的内容不能使用(调用)后期子类的特有内容。
使用多态的前提:必须有关系:继承或者实现;要有覆盖(未经向下类型转换时,只能调用父类或者接口中有的,且被覆盖的方法)。
父类型的引用可以指向其子类的对象,子类有很多,在父类引用接收子类对象后,如何进行判断并向下转型呢?利用instanceof 进行判断,此关键词用于判断对象的具体类型,只可以用于引用数据类型的判断,如果父类引用指向子类对象,则父类引用instanceof 子类名如person Instanceof Student,返回true或者false。instanceof通常情况下在向下转型前用于健壮性的判断。
例如:public static void specialMethod(Person p) {
if(p instanceof Student) {
Student s = (Student)p;
s.study();
}
else if(p instanceof Worker) {
((Worker)p).work();
}
}
引入对象的多态后,对成员特点的分析:(十分重要)
注意:重载和重写(覆盖)都是指的是方法的重载和重写,特别是当说覆盖时,指的也只是方法,成员变量没有覆盖这么一说,因为子类和父类中有重名的变量时,子类在实例化时会把这两个变量都进行封装,用特定的标号加以区分。
成员变量:编译时,查看引用类型所属类中是否拥有需要访问的变量,若有则编译通过,否则编译不通过。
编译和执行(调用)都是看引用(左边)。
此时只关注引用类型所属类中是否有此变量,所指向的对象所属类有与没有此变量都无所谓。若都有,利用父类型引用调用的是父类型中的变量值。
对于成员变量,存在多态时,无论是编译还是执行调用,看的都是父类型引用所在的类,调用的变量也只是父类中的变量,父类中没有则编译不通过,子类中有与没有此变量都无关紧要。因为成员变量没有覆盖这个概念之说,覆盖指的只是方法。
实例:class Animal{
int num = 6;//如果没有这句,则编译出错
}
class Dog extends Animal{
int num = 4;//这句话有或者没有,输出都是6,因为多态时,对于成员变量,只关注父类的成员变量,子类的不关心。
}
public class PolymorphismTest2 {
public static void main(String[] args) {
Animal animal = new Dog();
int num = anima
文档评论(0)