关键字this
1.关键字this是什么
(1)它在方法内部使用,即这个方法所以所属对象的引用
(2)它在构造器内部使用,表示该构造器正在初始化的对象
2.this可以调用什么
(1)类的属性
(2)类的方法
(3)类的构造器
3.this的作用
(1)区分属性和局部变量:this.name = name;
(2)使用this()调用本类的构造器
class Person{ // 定义Person类
private String name ;
private int age ;
public Person(){ // 无参构造器
System.out.println("新对象实例化") ;
}
public Person(String name){
this(); // 调用本类中的无参构造器
this.name = name ;
}
public Person(String name,int age){
this(name) ; // 调用有一个参数的构造器
this.age = age;
}
public String getInfo(){
return "姓名:" + name + ",年龄:" + age ;
}
}
4.注意
(1)可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其他的构造器!
(2)明确:构造器中不能通过"this(形参列表)“的方式调用自身构造器
(3)如果一个类中声明了n个构造器,则最多有 n - 1 个构造器中使用了"this(形参列表)”
(4)"this(形参列表)"必须声明在类的构造器的首行!
(5)在类的一个构造器中,最多只能声明一个"this(形参列表)
关键字super
1.关键字this是什么
可以理解为:父类的
2.super可以用于什么
(1)访问父类中定义的属性
(2)调用父类中定义的成员方法
(3)在子类构造器中调用父类的构造器
3.super调用属性、方法
(1)我们可以在子类的方法或构造器中。通过使用"super.属性"或"super.方法"的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略"super."
(2)当子类和父类中定义了同名的属性时,我们要想在子类中调用父类中声明的属性,则必须显式的使用"super.属性"的方式,表明调用的是父类中声明的属性。
(3)特殊情况:当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的使用"super.方法"的方式,表明调用的是父类中被重写的方法。
class Person {
protected String name = "张三";
protected int age;
public String getInfo() {
return "Name: " + name + "\nage: " + age; }
}
class Student extends Person {
protected String name = "李四";
private String school = "New Oriental";
public String getSchool() {
return school;
}
public String getInfo() {
return super.getInfo() + "\nschool: " + school;
}
}
public class StudentTest {
public static void main(String[] args) {
Student st = new Student();
System.out.println(st.getInfo());
}
}
4.super调用构造器
(1)我们可以在子类的构造器中显式的使用"super(形参列表)"的方式,调用父类中声明的指定的构造器
(2)"super(形参列表)"的使用,必须声明在子类构造器的首行!
(3)我们在类的构造器中,针对于"this(形参列表)"或"super(形参列表)“只能二选一,不能同时出现
(4)在构造器的首行,没显式的声明"this(形参列表)“或"super(形参列表)”,则默认调用的是父类中空参的构造器:super()
(5)在类的多个构造器中,至少一个类的构造器中使用了"super(形参列表)”,调用父类中的构造器
public class Person {
private String name;
private int age;
private Date birthDate;
public Person(String name, int age, Date d) {
this.name = name;
this.age = age;
this.birthDate = d;
}
public Person(String name, int age) {
this(name, age, null);
}
public Person(String name, Date d) {
this(name, 30, d);
}
public Person(String name) {
this(name, 30);
}
}
public class Student extends Person {
private String school;
public Student(String name, int age, String s) {
super(name, age);
school = s;
}
public Student(String name, String s) {
super(name);
school = s;
}
// 编译出错: no super(),系统将调用父类无参数的构造器。
public Student(String s) {
school = s;
}
}
5.注意
(1)尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员
(2)super的追溯不仅限于直接父类
(3)super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识
this与super的区别
No. | 区别点 | this | super |
---|---|---|---|
1 | 访问属性 | 访问本类中的属性,如果本类没有此属性则从父类中接续查找 | 直接访问父类中的属性 |
2 | 调用方法 | 访问本类中的方法,如果本类没有此方法则从父类中继续查找 | 直接访问父类中的方法 |
3 | 调用构造器 | 调用本类构造器,必须放在构造器的首行 | 调用父类构造器,必须放在子类构造器的首行 |