Java自定义Rotor类调用rotate()报cannot find symbol错误如何解决
错误原因
- 核心是**变量名遮蔽(Name Shadowing)**问题:你定义的构造方法参数
String rotor和类的成员变量private String rotor同名,在构造方法的作用域内,未加this修饰的rotor会被编译器识别为局部参数(String类型),而java.lang.String类本身没有rotate()方法,因此触发找不到符号的编译错误。 - 你自定义的
rotate()是Rotor类的实例成员方法,属于当前正在初始化的Rotor对象,需要通过this关键字明确指定调用主体。
修复方案
遵循OOP封装原则,不需要把rotate方法逻辑搬进构造方法,只需要修正调用语法即可,推荐两步优化从根源消除问题:
- 修改构造方法的参数名,避免和成员变量重名,消除歧义
- 调用自定义方法时加
this关键字,明确调用当前实例的成员方法
修复后的完整代码
public class Rotor{ private String rotor; // 参数名修改为inputRotor,避免和成员变量重名 public Rotor(String inputRotor, char top){ this.rotor = inputRotor; while(this.rotor.charAt(0)!=top){ // 明确调用当前Rotor实例的rotate方法 this.rotate(); } } //rotates rotor one click clockwise public void rotate(){ this.rotor = this.rotor.substring(this.rotor.length()-1) + this.rotor.substring(0, this.rotor.length()-1); } public char peek(){ return rotor.charAt(0); } public String toString(){ return rotor; } public static void main(String[] args){ Rotor rotor = new Rotor("#GNUAHOVBIPWCJQXDKRYELSZFMT", 'U'); System.out.println(rotor.toString()); } }
运行后输出结果和预期一致:UAHOVBIPWCJQXDKRYELSZFMT#GN
内容的提问来源于stack exchange,提问作者Brigitta Szepesi
相关产品推荐
相关产品推荐

