标签:子类 move 多态 Cat a1 编译 Animal
向上转型和向下转型 (前提是两种类型之间具有继承关系)
- 向上转型:将子类对象赋给父类引用
- 向下转型:将父类对象赋给子类引用(需要访问子类中特有的方法,如下面的catMouse()方法)
多态的解释
class test{
Animal a1 = new Cat();//向上转型
a1.move(); // 可以通过
a1.catchMouse();// 子类特有的方法,不能通过,编译阶段不通过。(a1到Animal中找catchMouse(),没找到,于是报错)。
}
class Animal{
public void move(){};
}
class cat extends Animal{
public void move(){};
public void catchMouse(){};
}
calss Bird extends Animal{
}
java程序执行分为编译阶段和运行阶段
-
编译阶段
编译器在编译检查语法的时候,发现a1为Animal类型,在调用move()方法的时候会到Animal.class文件中找move()方法,找到了,绑定上move(),编译通过,静态绑定成功。 -
运行阶段
在运行阶段的时候,实际在堆内存中创建的是Cat对象,于是到会到Cat中找move()方法并执行,这个过程属于动态绑定。
这就是多态的表现形式:编译时一种状态,运行时一种状态。
向下转型:(类似于强制类型转换)
Cat c = (Cat) a1;
c.catMouse();
将Animal类型的a1转换为Cat类型,此时c就能抓老鼠了。
向下转型的风险:
Animal a2 = new Bird();
Cat c2 = (Cat) a2;
/*
编译通过,运行报错
java.lang.ClassCastException 类型转换异常
*/
标签:子类,move,多态,Cat,a1,编译,Animal 来源: https://www.cnblogs.com/52ky/p/15361428.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。