【问题标题】:Can member of java class may not have fully qualified name except anonymous class?java类的成员除了匿名类之外可以没有完全限定名吗?
【发布时间】:2020-06-15 03:08:04
【问题描述】:

https://docs.oracle.com/javase/specs/jls/se13/html/jls-6.html#jls-6.7 指定

每个成员类、成员接口和数组类型可能有一个完全 限定名称:

另一个类或接口C的成员类或成员接口M 当且仅当 C 有一个完全限定的名字 姓名。 在这种情况下,M 的完全限定名由 C 的完全限定名,后跟“.”,后跟的简单名称组成 M.

但是根据同一个文档,每个类或接口都有FQN。

每个基本类型、命名包、顶级类和顶级 接口有一个完全限定的名称

既然可能在这个文档中被同情,那么除了匿名类之外,根据这个文档没有限定名称的成员的例子是什么?如果只有匿名类,那么为什么可以以这种通用的方式指定?

【问题讨论】:

    标签: java class


    【解决方案1】:

    本地类或匿名类没有完全限定名。

    所以排除

    public static void main(String[] args) {
        class MyLocal{}
    }
    

    一个数组类型有一个完全限定名当且仅当它的元素 type 有一个完全限定的名称。

    所以排除

    public static void main(String[] args) {
        class MyLocal{}      // doesn't have
        MyLocal[] arr = {};  // nor this one
    }
    

    另一个类或接口C的成员类或成员接口M 当且仅当 C 有一个完全限定的名字 名字。

    所以排除

    public static void main(String[] args) {
        class MyLocal{}
        class MyLocalChild extends MyLocal {}
    }
    

    【讨论】:

    • @kaya3 这就是他的意思吗?如果不是,我不明白这个问题。
    • 您的本地类和数组类型的示例都是正确的;但“成员类型”与继承无关。 MyLocalChild 不是成员类,尽管由于是本地类,它没有 FQN。
    【解决方案2】:

    但是根据同一个文档,每个类或接口都有FQN。

    不:the docs you quote 说(强调我的):

    每个原始类型、命名包、顶级类和顶级接口都有一个完全限定名

    关于成员类、成员接口和数组类型,他们这样说(强调我的):

    • 另一个类或接口 C 的成员类或成员接口 M 具有完全限定名称当且仅当 C 具有完全限定名称。
    • 当且仅当其元素类型具有完全限定名称时,数组类型具有完全限定名称。

    而且(重点仍然是我的):

    本地类或匿名类没有完全限定名。

    因此,不仅匿名类,而且一些成员类、成员接口和数组类型可能没有完全限定的名称,而本地类则永远不会。以下是一些示例的演示:

    class Outer {
        // anonymous class has no FQN
        Runnable r = new Runnable() {
            // member class has no FQN, because its enclosing class has no FQN
            class Member {}
    
            public void run() {
                // array type has no FQN, because its element type has no FQN
                Member[] members = new Member[3];
    
                // local class has no FQN
                class Local {}
            }
        };
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 2020-11-12
      • 1970-01-01
      • 2013-10-24
      • 2015-01-26
      • 1970-01-01
      相关资源
      最近更新 更多