一 super限定介绍
Java中允许通过关键字super来调用父类的方法或属性。
super不能出现在static修饰的方法中。
二 通过super限定访问父类的成员变量
1 代码示例 下载
- 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()
- {
- // 通过super来限定访问从父类继承得到的a实例变量
- System.out.println(super.a); //a
- }
- public static void main(String[] args)
- {
- SubClass sc = new SubClass();
- sc.accessOwner(); // 输出7
- sc.accessBase(); // 输出5
- }
- }
2 运行结果
7
5
3 结果分析下载
a变量在子类和父类都定义了。当系统创建SubClass对象时,实际上为SubClass对象分配两块内存,一块用于存储在SubClass类定义的a实例变量,一块用于存储从BaseClass类继承得到的a实例变量。
a处代码通过super限定访问从父类得到的a实例变量。
三 子类隐藏父类定义变量的内存运行图
1 代码示例下载
- class Parent
- {
- public String tag = "父类"; //①
- }
- class Derived extends Parent
- {
- // 定义一个私有的tag实例变量来隐藏父类的tag实例变量
- private String tag = "子类"; //②
- }
- public class HideTest
- {
- public static void main(String[] args)
- {
- Derived d = new Derived();
- // 程序不可访问d的私有变量tag,所以下面语句将引起编译错误
- // System.out.println(d.tag); //③
- // 将d变量显式地向上转型为Parent后,即可访问tag实例变量
- // 程序将输出:“父类”
- System.out.println(((Parent)d).tag); //④
- }
- }
HideTest.java
2 运行结果
父类
3 结果分析下载
程序先创建一个Derived对象,这个对象保存两个tag实例变量,一个是父类的,一个是子类的,此时程序中包括一个d变量,引用了一个Derived对象,内存示意图如上。
程序在④行代码处先将d变量强制向上转为Parent类型,再通过它来访问tag实例变量是允许的,此时系统将访问1行粗体代码处定义的tag实例变量。