getClass 方法 Java 与数组类型

2022-09-02 03:34:24

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

我遇到了一个问题,如果你创建一个任何类型的数组,并在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;

答案 1

类的 toString 方法调用类的 getName 方法,其中

以 String 形式返回由此类对象表示的实体(类、接口、数组类、基元类型或 void)的名称。如果此类对象表示的引用类型不是数组类型,则返回该类的二进制名称,如 Java™ 语言规范所指定。

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

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

 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"

答案 2

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