getClass方法带有数组类型的Java

所以我遇到了一些奇怪的东西,我不知道它叫什么,所以我很难找到有关它的信息,因此我的问题在这里。

我遇到了一个问题,如果你创建一个任何类型的数组并在Java中调用此数组上的getClass,你将获得奇怪的回报。 我想知道你为什么得到这个特定的回报及其含义。

代码示例如下:

byte[] me = new byte[1]; int[] me2 = new int[1]; double[] me3 = new double[1]; float[] me4 = new float[1]; String[] me5 = new String[1]; Integer[] me6 = new Integer[1]; System.out.println(me.getClass()); System.out.println(me2.getClass()); System.out.println(me3.getClass()); System.out.println(me4.getClass()); System.out.println(me5.getClass()); System.out.println(me6.getClass()); 

输出是:

  class [B class [I class [D class [F class [Ljava.lang.String; class [Ljava.lang.Integer; 

Class的toString方法调用Class的getName方法

以Stringforms返回此Class对象表示的实体名称(类,接口,数组类,基本类型或void)。

如果此类对象表示不是数组类型的引用类型,则返回类的二进制名称,如Java语言规范第二版所指定。

如果此类对象表示基本类型或void,则返回的名称是一个String,它等于与基本类型或void相对应的Java语言关键字。

如果此类对象表示一个数组类,则名称的内部forms由元素类型的名称组成,前面有一个或多个'[‘字符,表示数组嵌套的深度。 元素类型名称的编码如下:

 Element Type Encoding boolean Z byte B char C class or interface Lclassname; double D float F int I long J short S 

类或接口名称classname是上面指定的类的二进制名称。

例子:

  String.class.getName() returns "java.lang.String" byte.class.getName() returns "byte" (new Object[3]).getClass().getName() returns "[Ljava.lang.Object;" (new int[3][4][5][6][7][8][9]).getClass().getName() returns "[[[[[[[I" 

这只是一些愚蠢的命名约定。 如果它们更具人性可读性会更好: class byte[]class java.lang.Integert[][]

[类名称的开头应该被读作“……的数组”,其中“……”是[ ; 下面的约定在@emory引用和链接的Class.getName()的文档中详细说明。

Java语言规范的第4.3.1节开始:“对象是类实例或数组。” 这表明数组不是类实例。 (也许这就是@TigerTrussell在他的回答中所得到的。)但是, 第10.8节开始:“每个数组都有一个关联的Class对象,与具有相同组件类型的所有其他数组共享。数组类型的直接超类是Object “。 这表明,如果不是真正的类实例,则数组非常接近。

不幸的是,Java的语法规则禁止从数组类型inheritance:

 public class MyFancyArray extends int[] { // ILLEGAL // ... } 

请注意,这是一个语法约束; 没有概念或语义障碍(许多其他OO语言都允许这样做)。

数组没有类,它们只是数据结构。 具有类的唯一东西是从包括在数组中的Object扩展的东西。

这些是底层类型对象的名称。 [表示它是一个数组,后面的字母表示数组类型。 B = byte,I = integer,D = double等。“L”适用于类型成员,如您所见。