javaSE学习Day1

打印 上一主题 下一主题

主题 1764|帖子 1764|积分 5292

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
向下转型的使用

Java的多态性:

父类指向子类的声明
Animal animal = new Dog()//Dog()重写了父类Animal


  • 有了对象的多态性以后,内存实际上加载的是子类的属性和方法,但是由于变量声明为父类类型,导致编译时只能调用父类的属性和方法,子类特有的属性方法不能调用。
  • 调用子类特有的属性和方法:向下转型,使用强制类型转换符。
  • 向下转型有风险,使用强转可能出现ClassCastException异常。为了避免出现异常,此时应该使用instanceof关键字。
向下转型在开发中使用较少,一般只会用父类中存在的属性方法。
因为多态性是运行时行为,但是在编译的时候就已经加载了子类的属性和方法,但是用不了子类的特有方法,例如Dog子类类特有的方法liugou(),编译就会报错。
  1. //父类Animal:
  2. class Animal{
  3. public void eat(){
  4. System.out.println("吃吃吃");
  5. }
  6. public void shout(){
  7. System.out.println("叫叫叫");
  8. }
  9. }
  10. //子类Dog
  11. class Dog extends Animal{
  12. @Override
  13. public void shout() {
  14. System.out.println("汪汪汪");
  15. }
  16. public void eat(){
  17. System.out.println("吃狗粮");
  18. }
  19. //子类特有方法lugou()
  20. public void liugou(){
  21. System.out.println("遛狗");
  22. }
  23. }
  24. class Cat extends Animal{
  25.     @Override
  26.     public void shout(){
  27.         System.out.println("喵喵喵");
  28.     }
  29.     public void eat(){
  30.         System.out.println("吃鱼");
  31.     }
  32.     public void hand(){
  33.         System.out.println("手贱");
  34.     }
  35. }
复制代码
调用子类特有方法报错
  1. public class AnimalTest {
  2. public static void main(String[] args){
  3.    AnimalTest test = new AnimalTest();
  4.    test.func(new Dog());
  5. }
  6. public void func(Animal animal){
  7.    animal.eat();
  8.    animal.liugou();//子类特有方法报错
  9. }
  10. }
复制代码
向下转型(强制类型转换):
  1. public void func(Animal animal){
  2.       animal.eat();
  3.       Dog dog = (Dog) animal;//使用强制类型转换,不报错
  4.       dog.liugou();
  5.   }
复制代码
向下转型的风险(编译时可以通过,运行时出现ClassCastException异常):
  1.     public void func(Animal animal){
  2.         animal.eat();
  3.         Dog dog = (Dog) animal;
  4.         Cat cat = (Cat) animal;
  5.         cat.hand();//animal并没有加载cat的属性和方法,编译正常但是运行时错误
  6.         dog.liugou();
  7.     }
复制代码
instanceof关键字的使用方法:
a instanceof A:判断对象a是否是A的实例,如果是返回true,否则返回flase。
  1.         if(animal instanceof Cat){
  2.             Cat cat = (Cat) animal;
  3.             cat.hand();//animal不是Cat的实例,因此hand()不执行
  4.         }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表