顶
java的确有其局限性,但应该不是你所说的这个场景
应该是你代码写的有问题那我这个场景应该怎么写呢
你这种情况,应该用接口,而不是继承。把要暴露出来的方法定义在接口,别人使用时候就不会出现转型问题了。
男孩是人,但人未必是男孩。
一个男童,是不是人?回答:是。所以,Boy的引用,可以看作是Person类的引用。如你所云:
/*用创建Boy的构造方法造就出一个男孩,但其引用可以是Person类。*/Personp=newBoy();/*由于p是由创建Boy的构造方法造就出来的,所以可以将其引用转变成Boy类*/Boyboy=(Boy)p;
但是,将一个父类引用转为子类引用,虽然编译通过,但动态执行时就会报错。这不是代码写得有问题,而是这种思维逻辑不对:
一个人是否是男童?回答:未必。这就是你所说的情况:将一个父类引用转为子类引用,虽然编译通过,但动态执行时就会报错。所以
/*创建一个Person类的实体(引用)*/Personp=newPerson();/*由于p是由创建Person的构造方法造就出的,尽管编译通过,但运行起来,就会停机报错*/Boyboy=(Boy)p;
子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特。父类类型的引用只能调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的东西,是无可奈何的。因此,将父类类型的引用指向子类的对象,尽管编译通过,但在程序运行中,就会停机报错。理解很透彻啊
父类必定不能转子类啊(当然你用父类引用引用的对象本身就是子类,自己转自己肯定没问题)...
至于你出现这样的需求,不是java的问题,是在接口设计就有问题了。
父类不能转子类嗯就是这样
醒醒,这是面向对象的基础规则,什么时候变成安全性了
先别写框架
欢迎加入 java开发群262087628互相学习共同进步 请问:如何加入?
逻辑不是很对,Person不是Boy专有的父类,你不能要求每个Person都能转换成Boy,可以添加一个条件pinstanceofBoy,只有当Person对象是Boy的实例的时候,才这样转换