super关键字用来访问父类内容,而this关键字用来访问本类内容。
super关键字的用法有三种:
- 在子类的成员方法中,访问父类的成员变量。
- 在子类的成员方法中,访问父类的成员方法。
public class Fu {//父类内容
int num = 10;
public void method(){
System.out.println("父类方法");
}
}
public class Zi extends Fu{//子类内容
int num = 20;
public void methodZi(){
System.out.println("子类调用父类的成员变量"+super.num);
}
public void method1(){
super.method();
System.out.println("子类方法调用父类成员方法");
}
public static void main(String[] args) {
Zi zi = new Zi();
zi.method1();
zi.methodZi();
}
}
3. 在子类的构造方法中,访问父类的构造方法。子类构造方法中会默认使用super()调用父类的构造方法(子类构造方法的第一行),若使用super调用父类重载构造方法,则不再会有默认的super(),也就是说子类构造方法中只有一个父类构造方法,不会多也不会少。
public class Fu {//父类内容
int num = 10;
public Fu(){
System.out.println("父类无参构造方法");
}
public Fu(int num){
this.num = num;
System.out.println("父类有参构造方法");
}
}
默认调用父类无参构造方法
public class Zi extends Fu{//子类内容
int num = 20;
public Zi(){
//默认调用父类无参构造方法
System.out.println("子类构造方法");
}
public static void main(String[] args) {
Zi zi = new Zi();
}
}
使用super调用父类重载的构造方法,此时不再默认调用父类无参构造方法
public class Zi extends Fu{//子类内容
int num = 20;
public Zi(){
super(20);//调用父类有参构造方法
System.out.println("子类构造方法");
}
public static void main(String[] args) {
Zi zi = new Zi();
}
}
this关键字用来访问本类内容。用法也有三种:
- 在本类的成员方法中,访问本类的成员变量(可以用来对成员变量赋值)。
- 在本类的成员方法中,访问本类的另一个成员方法。
public class Zi {
int num = 20;
public int getNum() {
return num;
}
public boolean eq(){
if(this.getNum()==20){//使用this调用本类另一个构造方法
return true;
}else{
return false;
}
}
public void setNum(int num) {
this.num = num;//使用this访问本类的成员变量
}
public static void main(String[] args) {
Zi zi = new Zi();
System.out.println(zi.eq());
}
}
3. 在本类的构造方法中,访问本类的另一个构造方法(thisd调用另一个构造方法时也必须是构造方法第一行,也就是说super和this两种构造调用,不能同时使用)。
public class Fu {//父类内容
public Fu(){
System.out.println("父类无参构造方法");
}
}
public class Zi extends Fu{//子类内容
int num = 20;
public Zi(){
this(30);//使用this调用了本类的另一个构造方法,所以没有默认的super()
System.out.println("子类无参构造方法");
}
public Zi(int num){
//此处有默认的super()调用父类构造方法
this.num = num;
System.out.println("子类有参构造方法");
}
public static void main(String[] args) {
Zi zi = new Zi();
}
}