代码Sparrow spw= (Sparrow) new Bird();含义及子类继承父类属性疑问
问题解答
一、代码Sparrow spw= (Sparrow) new Bird();的含义与问题
这行代码试图将父类Bird的实例强制向下转型为子类Sparrow类型,但这种写法会直接抛出ClassCastException运行时异常。
原因很明确:子类Sparrow是Bird的一种,但父类Bird并不是Sparrow的一种。new Bird()创建的是纯粹的父类对象,内存里只有Bird类定义的属性和方法,完全没有Sparrow子类特有的成员,所以无法被安全转换成Sparrow类型。
合法的向下转型场景是先做向上转型(子类实例赋值给父类引用),再转回子类类型,比如:
Bird bird = new Sparrow(); // 向上转型,合法 Sparrow spw = (Sparrow) bird; // 向下转型,合法
二、Sparrow子类能否继承并使用Bird类的属性
作为Bird的子类,Sparrow默认会继承Bird中非private修饰的属性和方法:
public、protected修饰的属性,Sparrow实例可以直接访问使用;default(无修饰符,包访问权限)的属性,只要Sparrow和Bird在同一个包下,也能直接访问;private修饰的属性,Sparrow无法直接访问,但可以通过Bird类提供的getter/setter等公共方法间接操作这些属性。
内容的提问来源于stack exchange,提问作者Lohit Kumar Biswas
相关产品推荐
相关产品推荐

