当前位置: 首页 > 面试题库 >

Java中的可变阴影

和谦
2023-03-14
问题内容

我对此Java代码有一些疑问。它给出的输出是“ furry bray”。我的问题:

  1. 为什么我得到此输出?
  2. 我如何访问ZooKeeper类中的字符串对象引用“名称”?
  3. 如果它与变量屏蔽有关,那么哪个变量正在被屏蔽?

码:

class Mammal {
   String name = "furry ";
   String makeNoise() { return "generic noise"; }
 }
 class Zebra extends Mammal {
   String name = "stripes ";
   String makeNoise() { return "bray"; }
 }
 public class ZooKeeper {
   public static void main(String[] args) { new ZooKeeper().go(); }
   void go() {
     Mammal m = new Zebra();
     System.out.println(m.name + m.makeNoise());
     //Output comes as "furry bray". Please explain this.
     //And how can we access the name variable, the one having "stripes " in it.
     //Does it have something to do with Variable Shadowing?
   }
 }

问题答案:

变量不是多态的。当您访问时m.name,无论对象的执行时间类型如何,它都将 始终
使用Mammal.name属于该对象的字段。如果需要访问Zebra.name,则需要一个 编译时 类型为的表达式Zebra

makeNoise方法实际上被称为-执行时使用的实现方式 确实 取决于对象的类型。

请注意,如果您将所有字段都设为私有-无论如何这通常是个好主意-这最终不会成为问题。

这实际上是 隐藏 而不是阴影。有关隐藏的详细信息,请参见JLS第8.3

节;有关阴影的信息,请参见6.4.1节。我不能说我总是保持分歧…



 类似资料:
  • 问题内容: 在下面,我们有一个IIFE(像任何函数一样)创建本地作用域。在该范围内有一个功能。现在,由于浏览器中已经有一个具有该名称的全局函数,因此本地函数将使全局函数黯然失色-在IIFE中,任何对本地函数的调用都会调用本地函数,而不是全局函数。(仍可以使用引用全局函数。) 是否有 法律上的名称 (ECMAScript规范)或 事实上的 (通用的)名称?遮盖?超载? 问题答案: 正确的术语是[可变

  • 问题内容: 以下代码生成编译错误:“已声明并未使用err”。如果这里存在范围/阴影问题,那是由于我不了解的原理。有人可以解释吗? 问题答案: 这不是因为有任何阴影。除了为变量赋值之外,您没有使用任何声明的变量。 根据常见问题 未使用的变量的存在可能表明存在错误,而未使用的导入只会减慢编译速度。在代码树中积累足够的未使用导入,事情可能会变得很慢。由于这些原因,Go不允许 如果声明变量,则必须使用 在

  • 问题内容: 这是来自GOPL的示例-“表达式x [i]和x +’A’-‘a’分别引用外部块中x的声明;我们稍后将对此进行解释。” 解释永远不会到来。为什么x [i]引用外部范围中的x?只要在内部块中重新声明x,它就应该在外部块中遮盖x。为什么这样做? http://play.golang.org/p/NQxfkTeGzA 问题答案: 运算符创建一个新变量,并为其分配右侧值。 在for循环的第一个迭

  • 问题内容: 嗨,我在理解上面代码的输出时遇到了麻烦。输出为: 我理解为什么gc.r是10。我也理解为什么gc.getR()是10(因为GraphicCircle中的getR()方法覆盖了Circle的getR()方法)。但是我不明白为什么cr是100,而c.getR()是10(我很难理解当您像上面的代码那样键入到祖先类时继承发生了什么)。 问题答案: 方法调用在Java中是 虚拟 的,这意味着将调

  • 问题内容: 通过遵循所有Java标准,我的班级变得一成不变 这些是我在定义不可变类时所做的主要检查点。 但是还有一个问题,我的对象仍然可以通过java反射进行修改,对吗?还是我在课堂上错过了任何一点? 提前致谢。 问题答案: 没有什么可以躲藏的-即使是不可变的类也不能幸免。但是,您对此无能为力,因此“无法通过反射进行修改”不是不变性的标准之一。

  • 问题内容: 有没有Java原始数组的不变选择?制作一个原始数组final实际上并不能阻止人们做类似的事情 我希望数组的元素不可更改。 问题答案: 不适用于原始数组。你将需要使用列表或其他数据结构: