如何通过父类引用访问子类方法?求助解决调用报错问题
解决父类引用访问子类特有方法的问题
嘿,这个问题是Java里向上转型的典型坑,我来给你捋清楚怎么解决:
为什么会报错?
你写的Parent p1=new Child();是向上转型——用父类类型的引用指向子类对象,这本身是合法的。但Java是静态绑定语言,编译阶段编译器只会检查**引用类型(也就是Parent)**有没有对应的方法。Parent类里根本没定义print()方法,所以编译器直接报错了,哪怕实际运行时的对象是Child类型的也没用。
两种解决办法
1. 强制向下转型
把父类引用强制转换成子类类型,这样编译器就能识别子类的特有方法了。修改调用代码就行:
((Child)p1).print();
注意这里的括号不能少!因为.的优先级比强制转换高,必须用括号把(Child)p1包裹起来,不然编译器会先执行p1.print(),还是会报错。
2. 安全转型(结合instanceof)
如果你的代码里父类引用可能指向其他子类或者父类本身的对象,直接强制转型会抛出ClassCastException。这时候先做类型检查再转型更稳妥:
if (p1 instanceof Child) { Child c1 = (Child)p1; c1.print(); }
这样能避免运行时异常,代码更健壮。
修改后的完整代码
class Parent { public void show() { System.out.println("Show method in Parent class"); } } class Child extends Parent { public void print() { System.out.println("Print method in Child class"); } } public class Downcast { public static void main(String args[]) { Parent p1=new Child(); // 方法1:强制转型调用 ((Child)p1).print(); // 方法2:安全转型调用 if (p1 instanceof Child) { Child c1 = (Child)p1; c1.print(); } } }
额外小提示
如果这个print()方法是你希望所有子类都有的功能,也可以在Parent类里定义一个空的print()方法(或者抽象方法,如果Parent是抽象类的话),然后让Child类重写它。这样就不用转型,直接用父类引用调用p1.print()就行——不过这得看你的业务需求是不是适合这种设计。
内容的提问来源于stack exchange,提问作者Pratik Shemare
相关产品推荐
相关产品推荐

