跳到主要内容

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;
  • javaStudentsfrontendStudents:存储 Java 班和前端班学生的信息。
  • javaClassNamefrontendClassName:存储班级名称。

构造方法

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;
}
  • getJavaStudentsgetFrontendStudents:调用 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,使变量的含义更加明确。