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

Java类中的规范名称,简单名称和类名称有什么区别?

赫连智
2023-03-14
问题内容

在Java中,这些之间有什么区别:

Object o1 = ....
o1.getClass().getSimpleName();
o1.getClass().getName();
o1.getClass().getCanonicalName();

我已经多次检查过Javadoc,但这从来不能很好地解释它。我也进行了测试,但没有反映出调用这些方法背后的任何实际含义。


问题答案:

如果不确定某件事,请尝试先编写测试。

我这样做:

class ClassNameTest {
    public static void main(final String... arguments) {
        printNamesForClass(
            int.class,
            "int.class (primitive)");
        printNamesForClass(
            String.class,
            "String.class (ordinary class)");
        printNamesForClass(
            java.util.HashMap.SimpleEntry.class,
            "java.util.HashMap.SimpleEntry.class (nested class)");
        printNamesForClass(
            new java.io.Serializable(){}.getClass(),
            "new java.io.Serializable(){}.getClass() (anonymous inner class)");
    }

    private static void printNamesForClass(final Class<?> clazz, final String label) {
        System.out.println(label + ":");
        System.out.println("    getName():          " + clazz.getName());
        System.out.println("    getCanonicalName(): " + clazz.getCanonicalName());
        System.out.println("    getSimpleName():    " + clazz.getSimpleName());
        System.out.println("    getTypeName():      " + clazz.getTypeName()); // added in Java 8
        System.out.println();
    }
}

印刷品:

int.class(原始):
    getName():int
    getCanonicalName():int
    getSimpleName():int
    getTypeName():int

String.class(普通类):
    getName():java.lang.String
    getCanonicalName():java.lang.String
    getSimpleName():字符串
    getTypeName():java.lang.String

java.util.HashMap.SimpleEntry.class(嵌套类):
    getName():java.util.AbstractMap $ SimpleEntry
    getCanonicalName():java.util.AbstractMap.SimpleEntry
    getSimpleName():SimpleEntry
    getTypeName():java.util.AbstractMap $ SimpleEntry

新的java.io.Serializable(){}。getClass()(匿名内部类):
    getName():ClassNameTest $ 1
    getCanonicalName():空
    getSimpleName():    
    getTypeName():ClassNameTest $ 1

最后一个块中有一个空条目,其中getSimpleName返回一个空字符串。

结果是:

  • 名称 是您愿意使用动态加载与类,例如,调用的名称Class.forName与默认ClassLoader。在一定范围内ClassLoader,所有类都有唯一的名称。
  • 规范名称 是将在import语句中使用的名称。在执行toString或记录操作时,它可能很有用。当javac编译器具有类路径的完整视图时,它通过在编译时冲突完全限定的类和包名称来在其中强制规范名称的唯一性。但是,JVM必须接受此类名称冲突,因此规范名称不能唯一地标识内的类ClassLoader。(事后看来,该getter的更好的名字应该是getJavaName;但是此方法可以追溯到JVM仅用于运行Java程序的时间。)
  • 简单的名字 松散标识类,又可能是有用的过程toString或记录的操作,但不能保证是唯一的。
  • 类型名称 返回“ 此 类型名称 的信息字符串”,“类似于toString():它纯粹是信息信息,没有合约值”(如sir4ur0n所写)


 类似资料:
  • 在Java,这些有什么区别: 我已经检查了Javadoc多次,但这始终不能很好地解释它。我还运行了一个测试,但这并没有反映出这些方法的调用方式背后的任何真正意义。

  • 本文向大家介绍phpcms的分类名称和类别名称的调用,包括了phpcms的分类名称和类别名称的调用的使用技巧和注意事项,需要的朋友参考一下 话不多说,请看代码: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 问题内容: 直接使用和直接使用父类名称之间有区别吗?例如: 是否有内部之间的差异和? 问题答案: 在 这种情况下 不是。但是 通常 ,尤其是当您使用 多重继承时 ,按照文档中指定 的 方法 委托给 方法解析顺序(MRO)中 的下一个对象 : 返回将方法调用委托给类型的父级或同级类的 代理对象 。这对于访问已在类中重写的继承方法很有用。搜索顺序与所使用的顺序相同,只是类型本身被跳过。 类型的 属性列

  • 问题内容: 在我的Java应用程序中,我使用第三方库。 但是,我发现有些奇怪,有一些嵌套的程序包,有些类的名称可能与程序包的名称相同。 恐怕我不清楚。这是一个例子: 包 在“ com.xx.a”内部有一个名为“ a”的类。 因此,如果我想将此类称为“ a” … 我写: 然后,IDE将认为我的意思是软件包“ com.xx.a.a”。 那我就不能打电话了。 我想知道为什么? 顺便说一句,图书馆提供者似

  • 问题内容: 想知道是否有人在使用新功能通过PHP 5.3对类进行命名空间时是否遇到了此问题。 我正在使用单独的类来生成动态类调用,以在应用程序中定义用户类型。基本上,类定义器采用类型的整数表示形式并解释它们,返回一个包含要用作该用户模型的类名的字符串。 我在全局范围内定义了具有该名称的用户类型的对象模型,但是在Editor名称空间中,该用户的编辑器具有另一个名称相同的对象。由于某些原因,PHP不允