this
this是指向自身的一个对象,代表对象本身。
三种用法:
- 普通的直接引用,指向当前对象本身
- 形参与成员变量重名,用this来指向成员变量
class Person {
private int age = 10;
public Person(){
System.out.println("初始化年龄:"+age);
}
public int GetAge(int age){
this.age = age;
return this.age;
}
}
- 引用构造函数(当前对象的其他构造函数)
super
指向当前对象的父类,可以用super.xxx来引用父类的成员
- 子类中的成员变量与父类中成员变量相同时,可以用super.xxx取得父类的成员变量
class Person {
String name;
public void value() {
this.name = "tom";
}
}
class Student extends Person {
String name;
public void value() {
name = "jack";
super.value();
System.out.println(name);
System.out.println(super.name);
}
}
public class studySuperAndThis{
public static void main(String[] args) {
Student student = new Student();
student.value();
}
}
- 引用构造函数
super(参数):调用父类的构造函数(应该为构造函数中的第一条语句)
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)
class Person {
public static void prt(String s) {
System.out.println(s);
}
Person() {
prt("父类·无参数构造方法: " + "A Person.");
}//构造方法(1)
Person(String name) {
prt("父类·含一个参数的构造方法: " + "A person's name is " + name);
}//构造方法(2)
}
class Chinese extends Person {
Chinese() {
super(); // 调用父类构造方法(1)
prt("子类·调用父类“无参数构造方法”: " + "A chinese coder.");
}
Chinese(String name) {
super(name);// 调用父类具有相同形参的构造方法(2)
prt("子类·调用父类”含一个参数的构造方法“: " + "his name is " + name);
}
Chinese(String name, int age) {
this(name);// 调用具有相同形参的构造方法(3)
prt("子类:调用子类具有相同形参的构造方法:his age is " + age);
}
}
注意:
- super() 必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句都是隐含调用super()。如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
- this 和 super 不会出现在同一个构造函数中,因为你this调用的是本类的其他构造函数,而本类的其他构造函数又必然含有super,在同一个构造函数中出现相同的语句,就失去了语句的意义,编译也不会通过。
- super 和 this 都是指向对象的,所以均不可在static环境中使用,包括static方法、static变量、static语句块
- super是java的关键字,this是指向本对象的指针