首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >静态内部类和类的静态成员共享相同的名称?

静态内部类和类的静态成员共享相同的名称?
EN

Stack Overflow用户
提问于 2013-07-26 17:08:05
回答 4查看 475关注 0票数 9

静态内部类MC类的静态成员M如何共享同名?

以下代码生成"White“作为输出:

代码语言:javascript
复制
public class Amazed{

    public static void main(String[] args) {
        System.out.println(B.M.W);
    }
}

class B {
    public static class M {       
        static String W = "Black";
    }

    static C M = new C();
}

class C {
    String W = "White";
}

成员对象的访问方式,而不是静态类成员:W "Black“

如果我想访问静态类M中的成员,怎么办?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-26 17:32:11

Java语言规范第6章 (特别是第6.5款)详细阐述了Java在特定上下文中如何分类特定标识符的可怕细节。这些规则相当复杂,但粗略地说,Java有六个名称空间:

  • 包名
  • 类型名称
  • 字段(变量)名称
  • 方法名称
  • 局部变量名称(包括参数)
  • 标签

相同的标识符可用于每个名称空间中的实体。注意,类型(类)名称和字段名分别存在,这解释了为什么您的代码是合法的。

在同一名称空间中继承的名称有时也会被隐藏或蒙面。有时,标识符是模棱两可的;然后需要以某种方式对其进行限定(例如,使用包名),否则编译器会抱怨。

代码混淆器使用这一点有很大的优势,以至于您可以在包a中得到一个名为a的包和一个名为a的类(这个类也会被识别为a.a)。更不用说像dofor这样的Java关键字是.class文件中的合法名称(但在.class源代码中不是)。它有助于使逆向工程成为真正的熊。

票数 2
EN

Stack Overflow用户

发布于 2013-07-26 17:29:21

该变量掩盖了同名的类型。如果可以将名称解释为变量或类型,则首选变量。

你可以通过不给他们起同样的名字来避免这种情况。

来自Java语言规范,第6.4.2节:模糊

6.4.2.蒙蔽 简单名称可能出现在可能被解释为变量、类型或包的名称的上下文中。在这些情况下,§6.5的规则规定,变量优先于类型,类型优先于包。因此,有时可能不可能通过简单的名称来引用可见类型或包声明。我们说,这样的宣言是模糊的。

票数 1
EN

Stack Overflow用户

发布于 2013-07-26 17:27:11

在可以实例化M的特定情况下,您可以使用这样的事实:静力学可以以非静态的方式访问:

代码语言:javascript
复制
public class Amazed{
   @SuppressWarnings("static-access")
   public static void main(String[] args) {
       B.M val = new B.M();
       System.out.println(val.W);
   }
}

class B {
   public static class M {       
       static String W = "Black";
   }

   static C M = new C();
}

class C {
   String W = "White";
}

上面的内容将打印“Black”,因为您通过B.M实例引用它来消除标识符的歧义。当然,在生产代码中,这绝不是一个好主意,因为静态字段不应该以非静态的方式访问。同样,它要求您创建一个B.M实例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17887155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档