域和方法不同删除了类的一个方法后它有可能通过继承获得一个具有同样名称参数的不同方法但域不能覆盖这使得域在二进制兼容方面的表现也有所不同
例如假设有下面三个类
class Language {
String greeting = 你好;
}
class German extends Language {
String greeting = Guten tag;
}
class French extends Language {
String greeting = Bon jour;
}
则void test() { Systemoutprintln(new French()greeting); }的输出结果是Bon jour但是void test() { Systemoutprintln(((Language) new French())greeting); }的输出结果是你好这是因为实际访问的域依赖于实例的类型在第一个输出例子中test访问的是一个French对象所以输出结果是French的问候语但在第二个例子中虽然实际上访问的是一个French对象但由于French对象已经被定型成Language对象所以输出结果是Language的问候语
如果把上例的Language改成下面的形式
class Language { }
再次运行test(不重新编译)得到的结果是一个错误信息javalangNoSuchFieldError: greeting如果重新编译test则出现编译错误cannot resolve symbolsymbol : variable greeting location: class Language Systemoutprintln(((Language) new French())greeting);test仍能正常运行无需重新编译因为它不需要Language包含的greeting变量