首先了解下多态的基本概念
下面让我们看下武器类作业留下的疑问
如果同学觉得觉得图很多,也可以不看,下面写了具体关系
上面图的具体关系:weapon 是武器类,里面没有任何东西
每个接口都有一个方法,一个是soot(),一个是move()。
weapon具体类如Tank 实现了moveable接口和shootable接口,继承了weapon类
要理解这里weapon[i]用到了多态的向上转型
比如循环到Tank ,weapon Tank=new Tank(); 但是类型仍然是weapon
首先这里weapon类和接口是没有继承关系的,为啥还可以进行向下转型呢?其次这里为啥要用向下转型呢?
类在强制类型转换过程中,如果类转换为接口类型。那么类和接口之间是不需要存在继承关系,也可以转换,Java语法中允许。这种语法在编译期是没有问题的不会报错,但在运行期可能会报错。
用向下转型的原因是:weapon之所以不能直接调用设计方法是因为有些它的子类是没有设计方法的,设计方法都存在于接口中,所以此时先判断它的子类跟射击接口有没有关系,有关系的话才可以进行所谓的类转换为接口不需要继承关系
weapon Tank =new Tank(); 父类中没有move()方法,只有子类有所以想到用向下转型。
如果毫无关系的类转为接口类型就会编译不会报错,运行期一定报错
如上图weapon类进行了类型判断,weapon数组在运行阶段动态判断引用指向的对象的类型。
所以只有是实现了的move接口的类才可以进行向下转型.然后接下来怎么理解这个向下转型呢
这里虽然强制转换为接口类型,但是底层仍然是new Tank();这个对象,所以会调用坦克的移动方法。
spring中的疑惑
context.getBean()获取到的类型是Object
即Object a =new StudentServiceImpl();
由于Object 类中没有StudentServcieImpl类的方法,因此只有强转为该接口,或者强转为该实现类
才可以。
总结:当你创建的对象的类型是父类,new出来的对象是子类的时候,父类没有子类特有的方法,
方法,又想调用对象的方法。同时对象有一个接口,此时可以强转为接口类型,然后调用子类
的方法