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

在Customer类调用BasicInfo私有方法编译报错,求正确实现方式

问题解答

当前调用方式是否正确?

当前调用方式不正确,编译错误的核心原因是:fullName()、alsoKnownAs()、getGender()都是BasicInfo类的私有方法,Java中私有成员(方法/变量)仅能在定义它们的类内部访问,外部类(如Customer)没有权限直接调用这些私有方法。

正确的实现方式

方案1:将私有方法改为公共(public)方法

如果这些方法的功能本身需要对外暴露,直接修改它们的访问修饰符为public是最直接的解决办法。修改后的BasicInfo关键代码如下:

// 修改getGender()为public
public Gender getGender() {
    return g;
}

// 修改fullName()为public
public String fullName() {
    return (firstName + " " + secondName + " " + lastName);
}

// 修改alsoKnownAs()为public
public String alsoKnownAs() {
    return (firstName.charAt(0) + ". " + secondName.charAt(0) + ". " + lastName);
}

此时Customer类的displayInfo()方法无需修改,原调用方式即可正常编译运行。

方案2:添加规范的公共Getter方法

如果希望遵循JavaBean规范,可以给这些私有逻辑添加命名更统一的公共Getter方法,示例如下:

在BasicInfo中新增:

public String getFullName() {
    return fullName(); // 复用原私有方法的逻辑
}

public String getAlsoKnownAs() {
    return alsoKnownAs();
}

public Gender getGender() {
    return g;
}

然后修改Customer的displayInfo():

public void displayInfo() {
    System.out.printf("Full name: %s%n", bi.getFullName());
    System.out.printf("Also known as: %s%n", bi.getAlsoKnownAs());
    System.out.printf("Gender: %s%n", bi.getGender());
    System.out.printf("Year of birth: %d%n", birthYear);
}

方案3:复用BasicInfo的displayInfo()方法

如果不需要自定义BasicInfo部分的输出格式,可以直接调用BasicInfo已有的displayInfo()方法,再补充Customer自己的信息:

public void displayInfo() {
    bi.displayInfo(); // 直接调用BasicInfo的公共displayInfo()
    System.out.printf("Year of birth: %d%n", birthYear);
}

这种方式不需要修改BasicInfo的私有方法,适合不需要拆分输出内容的场景。


内容的提问来源于stack exchange,提问作者JohnnyBJorden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:55:35