Java中this关键字使用及makeValid方法实现问题咨询
解答你的Java makeValid方法疑问
首先,先搞清楚this.makeValid()的用法:在构造函数里,this指代的是当前正在创建的Message对象实例,调用this.makeValid()就是让这个刚创建的对象执行自己的makeValid方法。因为makeValid是Message类的成员方法,它可以直接访问类里的成员变量message和lengthOfMessage,所以完全不需要传字符串参数——它本来就有权操作当前对象的这些变量,这就是无参数方法能实现需求的原因。
接下来看你写的代码,有几个明显的问题需要修正:
- 你直接用了
builder但没初始化StringBuilder对象,编译肯定报错 - 变量名
mchar和mChar大小写不一致,Java是大小写敏感的,这会被当成两个不同的变量 - 没有处理非字母字符的校验逻辑,题目要求最终字符串仅包含字母,你得过滤掉或校验出非字母内容
- 最后没把处理后的结果赋值回
message变量,也没更新lengthOfMessage,等于白做了
正确的实现版本(过滤非字母+转小写)
如果需求是“保留所有字母并转小写,自动去掉非字母字符”,可以这么写:
public class Message { private String message; private int lengthOfMessage; public Message(String m) { message = m; lengthOfMessage = m.length(); this.makeValid(); // this可以省略,但显式写出来更清晰,表明是调用当前对象的方法 } public void makeValid() { // 初始化StringBuilder来高效构建处理后的字符串(字符串不可变,用Builder更高效) StringBuilder validMessageBuilder = new StringBuilder(); for (int i = 0; i < lengthOfMessage; i++) { char currentChar = message.charAt(i); // 先判断是否是字母(用Character类的API比硬写ASCII码更易读可靠) if (Character.isLetter(currentChar)) { // 转换为小写,同样用API避免手动计算ASCII的误差 char lowerCaseChar = Character.toLowerCase(currentChar); validMessageBuilder.append(lowerCaseChar); } // 非字母字符直接跳过,相当于过滤掉 } // 将处理后的结果更新回成员变量 message = validMessageBuilder.toString(); // 更新长度为处理后的实际长度 lengthOfMessage = message.length(); } // 可选:添加get方法方便查看处理后的结果 public String getMessage() { return message; } }
如果校验要求是“存在非字母就报错”
如果题目里的“校验”是指不允许字符串包含非字母字符(一旦有就抛出异常),那可以修改逻辑:
public void makeValid() { StringBuilder validMessageBuilder = new StringBuilder(); for (int i = 0; i < lengthOfMessage; i++) { char currentChar = message.charAt(i); if (!Character.isLetter(currentChar)) { // 校验不通过,抛出异常提示 throw new IllegalArgumentException("消息包含非字母字符:" + currentChar); } // 转换为小写并添加 validMessageBuilder.append(Character.toLowerCase(currentChar)); } message = validMessageBuilder.toString(); lengthOfMessage = message.length(); }
关键总结
this.makeValid()的作用就是让当前对象执行自己的成员方法,因为方法能直接访问成员变量,所以不需要传参- 处理字符时优先用Java提供的
Character类API,比硬写ASCII码更规范、可读性更强 - 一定要记得更新成员变量
message和lengthOfMessage,否则处理后的结果不会被保存
内容的提问来源于stack exchange,提问作者primms123
相关产品推荐
相关产品推荐

