Manager是boss的子类
Manager boss = new Manager(...);
Employee[] staff = new Employee[3];
staff[0] = boss;
在这个例子中,变量 staff[0] 和 boss 引用同一个对象,为什么都不可以调用Manager中的方法呢?
书上说编码器将staff[0]看成Employee 对象,表示不理解
这是服务提供者和使用者之间的契约。
举个不那么恰当的例子,A厂卖水泥,钢筋,A厂和B厂签订合同说,A卖水泥给B。
虽然A实际上还可以卖钢筋,但按照合同约定B只能跟A要水泥。
A厂就是那个对象,能力可以无限强,合同就是对象声明的类型,限定了对外暴露的能力,使用者(B厂)只能按照合同约定(对象声明)来使用。
这是因为staff[0]声明的类型是Employee,不能将一个超类的引用赋给子类变量。原因很清楚,不是所有的雇员都是经历。如果赋值成功,后面调用的时候就有可能发生运行时错误。
http://www.codeweblog.com/%E7%BB%A7%E6%89%BF-%E7%BB%A7%E6%89%BF%E5%B1%82%E6%AC%A1-%E5%A4%9A%E6%80%81-%E5%8A%A8%E6%80%81%E7%BB%91%E5%AE%9A%E4%B8%8E%E9%98%BB%E6%AD%A2%E7%BB%A7%E6%89%BF/
这是典型的多态场景,所谓写程序就是将现实逻辑用计算机能懂的方式描绘出来,现实中,一个公司所以的人都可以叫员工,但是分工不同,有些人是管理者,有些人是执行者等等,所有员工都具有共同属性,例如名字,年龄,但是不同的员工有不同的工作细节,例如程序员会设计程序,但不是所有员工都会写程序,所以员工不能调用子类的独有方法,这就是多态的意义所在,当然这是我的理解,每个人理解都不同,时间长了,很多语法才能真正明白它的意义所在
这个问题类似于接口和实现类的问题,你暴露给使用者是什么对象,使用者就只能看到暴露对象的方法。
例如 -Employee e = new Mangager()
1.楼上的超类说错了,明显Employee是超类;
2.因为子类的方法,需要子类或者子类的子类才能调用
而你赋值的引用时父类,这时候java不清楚它的具体类型是Manager
如果你需要调用manager的方法,那么需要对staff[0]进行向下强转;
3.java中向上转型(引用类型转的只是引用类型,实际对象并未发生任何改变)是自动的,向下转型是需要显示的
强制转换的;
希望可以帮到你...
Manager是boss的子类
Manager boss = new Manager(...);
Employee[] staff = new Employee[3];
staff[0] = boss;
在这个例子中,变量 staff[0] 和 boss 引用同一个对象,为什么都不可以调用Manager中的方法呢?
书上说编码器将staff[0]看成Employee 对象,表示不理解
staff是Employee类型,而boss是Manager类型,类型不一样,虽然是引用但是定义的类型不同,所以Manager的方法不能调用,但可以调用Employee方法,由于staff[0] = boss;可以赋值成功,说明Manager是Employee的子类,应该是可以调用Employee和Manager的共有方法
是不是可以这么理解,从JVM层面上来说,只是引用的互相相等,但是并没有改变这两个引用对引用的对象