服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java二进制兼容规则:域


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

扫描关注微信公众号