5.6.3 super限定

来源:互联网 发布:民国报刊数据库 编辑:程序博客网 时间:2024/05/22 07:42

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();    }}

运行结果

75

实际上系统会为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实例变量是允许的。

0 0
原创粉丝点击