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

当静态变量与Java中的静态类同名时会发生什么?

子车俊哲
2023-03-14
问题内容

在下面的Java示例中,谁能确切解释为什么程序输出为“ Orange”?(这是一个面试问题)

public class Finder {
  public static void main(String[] args){
    System.out.println(X.Y.Z);
  }
}

class X {
  static W Y = new W();
  static class Y {
    static String Z ="Apple";
  }
}

class W {
  String Z = "Orange";
}

问题答案:

变量Y掩盖了类型Y。请参见JLS:

6.4.2。遮盖

简单名称可能出现在可能被解释为变量,类型或包的名称的上下文中。在这些情况下,第6.5节的规则指定将优先于类型选择变量,并优先于包选择类型。因此,有时可能无法通过其简单名称引用可见类型或程序包声明。我们说这样的声明是模糊的。

合格名称XYZ的解析是根据:

6.5.2。上下文不明确名称的重新分类

如果名称在“。”的左边。被重新分类为TypeName,则:

  • 如果标识符是TypeName表示的方法名称或类型的类型的字段,则此AmbiguousName将重新分类为ExpressionName。

  • 否则,如果标识符是用TypeName表示的类型的成员类型的名称,则此AmbiguousName将重新分类为TypeName。

  • 否则,将发生编译时错误。

实际上,由于类型和变量的常规命名约定,这种情况不太可能发生。



 类似资料:
  • 问题内容: 我已经定义了一个对象并声明了一个静态变量。在该方法中,当我尝试打印实例和类变量时,两者都打印相同的值。 不是实例变量吗?它应该打印0而不是50吗? 问题答案: 不,只有一个变量-您尚未声明任何实例变量。 不幸的是,Java允许您访问静态成员,就像通过相关类型的引用访问静态成员一样。这是IMO的设计缺陷,某些IDE(例如Eclipse)允许您将其标记为警告或错误- 但这是语言的一部分。您

  • 我试图理解当带有全局变量和静态变量的模块动态链接到应用程序时会发生什么。通过模块,我指的是解决方案中的每个项目(我经常使用Visual Studio!)。这些模块要么内置在*. lib或*. dll中,要么内置在*. exe本身中。 我理解,应用程序的二进制文件包含数据段中所有单个翻译单元(目标文件)的全局和静态数据(如果const,则为只读数据段)。 > 当这个应用程序使用带有加载时动态链接的模

  • 问题内容: 通常,最终静态成员,尤其是变量(或静态最终变量,当然可以以任何顺序使用,而不会重叠含义)已广泛用于Java接口中,以定义实现类的 协议行为 ,这意味着实现该类的类(继承)接口必须包含该接口的所有成员。 我无法区分 final 和 final静态 成员。final静态成员是一个声明为final或其他东西的静态成员?在哪些特定情况下应专门使用它们? 永远不能在方法内部,静态方法内部或实例方

  • 问题内容: 根据Java,静态变量可以通过类名访问,但是即使Java不建议使用静态变量,类对象也可以访问它们,并且给出相同的答案。 我知道该变量只有一个副本,并且所有对象和其他事物的值都相同。Java为什么建议使用类名而不是类对象? 问题答案: 因为可能会造成混淆!静态成员上没有动态调度。 看一下这个令人困惑的代码:(可能是语法错误;我的Java生锈了) 看起来很混乱,因为方法似乎是多态的,所以输

  • 问题内容: 我知道不可能在一个类中重写一个方法。但是,有没有办法使用非静态方法作为静态方法呢?例如,我有一个加数字的方法。我希望此方法在没有对象的情况下有用。是否可以在不创建其他方法的情况下执行类似的操作? 编辑:我的意思是,如果我将一个方法设为静态,我将需要它接受参数,如果我创建了一个已经设置了变量的对象,那么再次对具有相同参数的对象调用函数将非常不舒服。 我知道代码不正确,但是我想展示自己想做

  • 我不知道什么时候在程序中使用一个静态/非静态变量。 我理解非静态/静态变量之间的区别,但我只是不知道何时使用每一个变量。那么在上面的代码中,为什么函数不能是静态的呢?(什么时候应该是静态的?)