WEB开发网
开发学院WEB开发Jsp Java二进制兼容规则:域 阅读

Java二进制兼容规则:域

 2008-01-05 09:55:25 来源:WEB开发网   
核心提示:域和方法不同,删除了类的一个方法后,Java二进制兼容规则:域,它有可能通过继续获得一个具有同样名称、参数的不同方法,但域不能覆盖,test1仍能正常运行,无需重新编译,这使得域在二进制兼容方面的表现也有所不同, 例如

  域和方法不同。删除了类的一个方法后,它有可能通过继续获得一个具有同样名称、参数的不同方法,但域不能覆盖,这使得域在二进制兼容方面的表现也有所不同。
  
  例如,假设有下面三个类:
  
  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变量。

Tags:Java 二进制 兼容

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接