super用于限定该对象调用它从父类继承得到的实例变量或方法,正如this不能出现在static修饰的方法中一样,super也不能出现在static修饰的方法一样。
package chap5_6;
class BaseClass
{
public int a=5;
}
public class SubClass extends BaseClass {
public int a=7;
public void accessOwner()
{
System.out.println(a);
}
public void accessBase()
{
System.out.println(super.a);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SubClass sc=new SubClass();
sc.accessOwner();
sc.accessBase();
}
}
运行结果
7
5
实际上系统会为SubClass对象分配两块内存,一块用于存储在SubClass类中定义的a实例变量,一块用于存储从BassClass类继承得到的a实例变量。
如果在某个方法中访问名为a的成员变量,但没有显式指定调用者,则系统查找a的顺序为:
1查找该方法中是否有名为a的局部变量
2.查找当前类中是否包含名为a的成员变量
3.查找a的直接父类中是否包含名为a的成员变量。
因此系统在创建子类对象时,依然会为父类中定义的、被隐藏的变量分配内存空间。
package chap5_6;
class Parent
{
public String tag="疯狂Java";
}
class Derived extends Parent
{
private String tag="轻量级Java";
}
public class HideTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Derived d=new Derived();
// System.out.println(d.tag);
System.out.println(((Parent)d).tag);
}
}
运行结果
疯狂Java
程序先将d变量强制向上转型为Parent类型,再通过它来访问tag实例变量是允许的。