相同点:
1.都是Java中的关键字
2.都只可以在非静态方法中使用
3.在构造方法中使用必须是第一条语句并且二者不可以同时存在
不同点:
1.this是当前对象的引用,super是子类对象从父类继承下来部分成员的引用
2.在非静态成员方法中,this用来访问本类的方法和属性,super用来访问从父类继承下来的方法和属性
3.在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现
this
访问当前类的成员变量:
在方法或构造器中,当局部变量的名字与实例变量同名时,用 this 来区分。
public class Person {private String name;public Person(String name) {this.name = name; // 使用 this 来区分参数 name 和实例变量 name}
}
调用当前类的构造器:
使用 this(...) 调用当前类的其他构造器(这个调用必须是构造器中的第一条语句)
public class Person {private String name;private int age;public Person(String name) {this(name, 0); // 调用另一个构造器}public Person(String name, int age) {this.name = name;this.age = age;}
}
在非静态方法中引用当前对象:
将当前对象作为参数传递给其他方法
super
调用父类的构造器:
在子类的构造器中,可以使用 super(...) 调用父类的构造器,且必须是构造器中的第一条语句。
若未显式调用,Java 会自动调用父类的无参构造器。
public class Employee extends Person {private double salary;public Employee(String name, int age, double salary) {super(name, age); // 调用父类的构造器this.salary = salary;}
}
访问父类的成员变量和方法:
当子类有和父类同名的成员变量或方法时,可以用 super 来区分父类和子类的成员
public class Employee extends Person {private String name; // 与父类的 name 冲突public void printName() {System.out.println(super.name); // 输出父类的 nameSystem.out.println(this.name); // 输出子类的 name}@Overridepublic void work() {super.work(); // 调用父类的 work 方法System.out.println("Employee is working.");}
}