请教一下,为什么第二个输出不是A?谢谢
虽然objectB原来的引用是classB,但是不是强转成classA后才赋给as的吗?
是因为as指向的是objectB仍然定义为classB,所以强转成classA的操作不起作用吗?
这个还涉及到了多态的问题,首先,多态存在的三个必要条件:继承、重写、父类引用指向子类对象。其次当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。这里的条件都符合多态条件,B继承A,B中重写A的printValue方法,A的引用(as)指向子类B
所以输出的是B 而不是A
还有一点,如果在B中添加一个A没有的方法,你会发现as是不能调用父类A没有而子类B有的方法,这就是多态的原因
尽管强转为ClassA,但本质还是ClassB,主要是ClassB重写了ClassA的printValue方法,你可以尝试一下先去掉ClassB中printValue方法
java是面向对象的,所谓对象就是一个实体,比如:人。
现在你new了一个“人”,打印走路方法结果是“直立行走”
“人”当然也属于“动物类“了,然后你把他放到“动物类里”,再打印走路方法,当然还是“直立行走”了,他虽然在“动物类“里关着,但本质还是“人”。
这就是面向对象和面向过程的区别之一。