对面向对象程序设计语言中,对象模型是实现诸如封装、继承、多态的重要基础。在常见的面向对象语言:C++和Java等中,子类是继承了父类的所有实例字段的:也就是一个子类对象中包含了一个完整的父类对象。在C++中通过对子类对象进行sizeof运算求出其大小便可以很容易验证是否继承了父类中的private实例变量。但是Java中没有sizeof运算,今天突然想到一种方法也可以说明:子类对象中包含了父类private实例字段的。那就是通过错误提示信息。
class Base
{
private int i = 0;
}
class Son extends Base
{
public static void main(String[] args)
{
Son s = new Son( );
System.out.println(s.i);
}
}
会产生错误提示信息:Son.java:21: i 可以在 Base 中访问 private。
当我们注释掉 extends Base 以后Son没有继承自Base,此时编译出错信息为:
Son.java:21: 找不到符号
符号: 变量 i
位置: 类 Son
也就说明了若Son中没有包含实例变量i,则编译器应该会报错找不到符号。
Java虚拟机的连接模型中:通常有一个解析的过程:对某个类的字节码文件中所引用的其他类的实例变量或数据成员有一个解析的过程:其中就包括了对实例成员变量是否在类定义中存在的验证(包括对其父类和父类的父类等等),对成员变量是否具有访问权限等。通过错误提示信息可以看出:子类对象继承了父类的private实例变量。