介绍
- this:当前对象
- super:直接父类对象
- this():当前类的无参构造方法,也可以指定有参的如:this(a)
- super():直接父类的无参构造方法,也可以指定有参的如:super(a)
注意
1,当在方法内调用一个变量b,编译器会向上遍历,直到找到最近的一个引用变量为止:b—>this.b—>super.b,如果未找到,编译器将显式提示错误信息;
2,当变量b的定义只发生在父类时,此时 b=this.b=super.b;
3,当局部变量b覆盖成员变量b时,使用this.b调用成员变量,此时的成员变量包括子类新增和继承的变量,不包含隐藏变量;
4,当子类成员变量b覆盖父类成员变量b时,使用super.b调用这个被隐藏的成员变量;
5,当子类重写了父类方法method(),可以使用super.method()来调用父类被隐藏的方法;
6,super()与this()具备硬性使用条件,否则编译无法通过——Constructor call must be the first statement in a constructor.即 二者出现的位置必须是构造方法的第一行;
7,super()与this()并不像super.b与this.b一样可以向下替代,因为子类并不能继承父类的构造方法,仅仅是包含了父类的有参或无参构造器(默认无参);
8,Implicit[不言明的,隐式的] super constructor Subject() is undefined. Must explicitly[明确地] invoke another constructor,这句话表明 —— 子类的构造方法中必须调用父类的构造方法,如果没有显式写出super(),则默认调用父类的无参构造方法。但此时如果父类写了有参的构造方法,编译器就不会再为父类默认创建无参构造方法,此时super()没有被定义,则必须在子类的构造方法中写明super(参数)或者在父类中显式写出父类的无参构造方法;
实例
父类
public class Subject{
public String a="我是父类全局变量a";
public String b="我是父类全局变量b";
public void operation(){
System.out.println("我是父类方法");
};
public void operation1(){
System.out.println("我是父类方法");
};
}
子类
public class MySubject extends Subject {
public String b="我是子类全局变量b";
@Override
public void operation() {
System.out.println(a);
System.out.println(this.a);
System.out.println(super.a);
}
@Override
public void operation1() {
String b="我是局部变量b";
System.out.println(b);
System.out.println(this.b);
System.out.println(super.b);
}
public static void main(String[] args) {
Subject sub=new MySubject();
sub.operation();
sub.operation1();
}
}
运行结果
我是父类全局变量a
我是父类全局变量a
我是父类全局变量a
我是局部变量b
我是子类全局变量b
我是父类全局变量b