You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从超类访问子类方法:面向对象编程电话本作业求助

解决PhoneBookEntry中无法访问PhoneNumber子类方法的问题

嘿,我之前做类似的面向对象作业时也踩过这个坑!问题的核心是你在ArrayList<ContactInfo>里存储的是父类ContactInfo类型的引用——哪怕实际对象是子类PhoneNumber,直接通过父类引用也只能调用父类定义的方法,没法直接访问子类独有的方法。下面给你两种可行的解决方案:

方案1:类型检查+向下转型

如果只是临时处理这个场景,可以在遍历contactInfos的时候,先判断当前对象是不是PhoneNumber类型,再通过向下转型获取子类对象,进而调用它的专属方法。示例代码如下:

public class PhoneBookEntry {
    private ArrayList<ContactInfo> contactInfos;

    // 构造方法、其他成员方法省略

    public void displayPhoneNumbers() {
        for (ContactInfo info : contactInfos) {
            // 先判断当前对象是否为PhoneNumber实例
            if (info instanceof PhoneNumber) {
                // 向下转型为PhoneNumber类型
                PhoneNumber phoneNumber = (PhoneNumber) info;
                // 调用子类独有的方法,比如获取号码的getPhoneNumber()
                System.out.println("电话号码:" + phoneNumber.getPhoneNumber());
            }
        }
    }
}

这种方法简单直接,但缺点是需要手动做类型判断,不符合开闭原则——如果之后新增其他ContactInfo的子类,你得修改这个方法的判断逻辑。

方案2:利用多态(推荐)

更符合面向对象设计理念的方式,是让父类ContactInfo定义一个抽象的展示方法,然后让子类PhoneNumber去重写这个方法。这样遍历的时候直接调用父类的方法,就会自动执行子类的实现,完全不需要转型。

首先修改父类ContactInfo:

public abstract class ContactInfo {
    // 定义抽象的展示方法,子类必须实现
    public abstract void displayContact();
}

然后让PhoneNumber重写这个方法:

public class PhoneNumber extends ContactInfo {
    private String phoneNumber;

    // 构造方法、getter等省略

    @Override
    public void displayContact() {
        System.out.println("电话号码:" + this.phoneNumber);
    }
}

最后修改PhoneBookEntry的displayPhoneNumbers()方法:

public void displayPhoneNumbers() {
    for (ContactInfo info : contactInfos) {
        // 直接调用父类方法,多态会自动触发子类的实现
        info.displayContact();
    }
}

这种方法不仅解决了你的问题,还让代码更具扩展性——之后如果新增EmailInfo之类的子类,只要重写displayContact()方法,当前的展示方法不需要任何修改就能适配。

内容的提问来源于stack exchange,提问作者Mertcan Seğmen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:39:30