super和this关键字都可以用来覆盖Java语言的默认作用域,使被屏蔽的方法或变量变为可见。在以下场合会出现方法或变量被屏蔽的现象:
场合一:在一个方法内,当局部变量和类的成员变量同名,或者局部变量和父类的成员变量同名时,按照变量的作用域规则,只有局部变量在方法内可见。
场景二:当子类的某个方法覆盖了父类的一个方法时,在子类的范围内,父类的方法不可见。
场景三:当子类中定义了和父类同名的成员变量时,在子类的范围内,父类的成员变量不可见。
请看以下代码:
class Base{ String var="Base`s Variable"; void method(){ System.out.println("call Base`s method"); } } public class Sub extends Base{ String var="Sub`s Variable";//隐藏父类的var变量 void method(){ System.out.println("call Sub`s method"); }//覆盖父类的method方法 void test(){ String var="Local variable";//局部变量 System.out.println("var is"+var);//打印method()方法的局部变量 System.out.println("this.var is"+this.var);//打印Sub实例的实例变量 System.out.println("super.var is"+super.var);//打印在Base类中定义的实例变量 method();//调用Sub实例的method()方法 this.method();//调用Sub实例的method()方法 super.method();//调用在Base类中定义的method()方法 } public static void main(String[] args) { Sub sub=new Sub(); sub.test(); } }
在Base父类和Sub子类中都定义了成员变量var以及成员方法method(),在Sub类中,可通过super.var和super.method()来访问Base类的成员变量var,以及成员方法method()。
值得注意的是,如果父类中的成员变量和方法被定义为private类型,那么子类永远无法访问它们。
在程序中,在以下情况会使用super关键字:
1)在子类中访问父类的被屏蔽的方法和属性。
2)在类的构造方法中,通过super语句调用这个类的父类的构造方法
注意:假如在子类的构造方法中有super语句,它必须作为构造方法的第一条语句