在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
相关产品推荐
相关产品推荐

