this 关键字与类的关系
this
关键字用于引用当前类的对象,并访问其属性和方法。在类的方法中,this
提供了一种方式来区分类的成员变量与方法的参数或局部变量,尤其是在它们同名的情况下。
示例代码
以下是一个使用 this
关键字的示例类 MyClasses
:
public class MyClasses {
private String[][] javaStudents = {{"张三", "广东"}, {"李四", "四川"}, {"王五", "河南"}};
private String[][] frontendStudents = {{"张三", "北京"}, {"赵六", "安徽"}, {"李四", "四川"}, {"王五", "河南"}};
private String javaClassName;
private String frontendClassName;
public MyClasses() {
}
public MyClasses(String javaClassName, String frontendClassName) {
// 构造方法参数与成员变量同名,使用 this 进行区分
this.javaClassName = javaClassName;
this.frontendClassName = frontendClassName;
}
public String[][] getJavaStudents() {
// 成员方法调用可以省略 this
formatInfo("java", javaStudents);
return javaStudents;
}
public String[][] getFrontendStudents() {
formatInfo("frontend", frontendStudents);
return frontendStudents;
}
private void formatInfo(String field, String[][] classInfo) {
switch (field) {
case "java":
System.out.println(javaClassName);
break;
case "frontend":
System.out.println(frontendClassName);
break;
default:
break;
}
for (String[] studentInfo : classInfo) {
String name = studentInfo[0];
String region = studentInfo[1];
System.out.println(name + " " + region);
}
System.out.println();
}
public void findCommonStudents() {
for (String[] javaStudent : this.javaStudents) {
String javaName = javaStudent[0];
String javaRegion = javaStudent[1];
for (String[] frontendStudent : frontendStudents) {
String frontendName = frontendStudent[0];
String frontendRegion = frontendStudent[1];
// 使用 equals 方法比较字符串内容
if (javaName.equals(frontendName) && javaRegion.equals(frontendRegion)) {
System.out.println(Arrays.toString(javaStudent));
}
}
}
}
}
代码解析
成员变量与构造方法
private String[][] javaStudents = {{"张三", "广东"}, {"李四", "四川"}, {"王五", "河南"}};
private String[][] frontendStudents = {{"张三", "北京"}, {"赵六", "安徽"}, {"李四", "四川"}, {"王五", "河南"}};
private String javaClassName;
private String frontendClassName;
javaStudents
和frontendStudents
:存储 Java 班和前端班学生的信息。javaClassName
和frontendClassName
:存储班级名称。
构造方法
public MyClasses() {
}
public MyClasses(String javaClassName, String frontendClassName) {
this.javaClassName = javaClassName;
this.frontendClassName = frontendClassName;
}
- 无参构造方法:默认构造方法。
- 带参构造方法:使用
this
关键字区分成员变量与参数,便于维护和阅读。
获取学生信息的方法
public String[][] getJavaStudents() {
formatInfo("java", javaStudents);
return javaStudents;
}
public String[][] getFrontendStudents() {
formatInfo("frontend", frontendStudents);
return frontendStudents;
}
getJavaStudents
和getFrontendStudents
:调用formatInfo
方法格式化并输出学生信息,同时返回相应的学生数组。
格式化信息的方法
private void formatInfo(String field, String[][] classInfo) {
switch (field) {
case "java":
System.out.println(javaClassName);
break;
case "frontend":
System.out.println(frontendClassName);
break;
default:
break;
}
for (String[] studentInfo : classInfo) {
String name = studentInfo[0];
String region = studentInfo[1];
System.out.println(name + " " + region);
}
System.out.println();
}
- 根据传入的
field
参数,打印相应班级的名称。 - 遍历并打印每个学生的姓名和所在地区。
查找共同学生的方法
public void findCommonStudents() {
for (String[] javaStudent : this.javaStudents) {
String javaName = javaStudent[0];
String javaRegion = javaStudent[1];
for (String[] frontendStudent : frontendStudents) {
String frontendName = frontendStudent[0];
String frontendRegion = frontendStudent[1];
if (javaName.equals(frontendName) && javaRegion.equals(frontendRegion)) {
System.out.println(Arrays.toString(javaStudent));
}
}
}
}
- 使用
this
关键字明确调用当前类的javaStudents
数组。 - 使用
equals
方法比较字符串内容,避免使用==
进行引用比较。
注意事项
- 在构造方法中,当参数名称与成员变量相同时,使用
this
关键字可以清晰地区分它们,提升代码的可读性和可维护性。 - 比较字符串内容时,应使用
equals
方法,而不是==
,以确保内容的正确比较。 - 优化变量名称,例如将
javaClass
改为javaStudents
,使变量的含义更加明确。