具有数组类型的 getClass 方法 Java
Posted
技术标签:
【中文标题】具有数组类型的 getClass 方法 Java【英文标题】:getClass method Java with array types 【发布时间】:2011-10-15 13:52:56 【问题描述】:所以我遇到了一些奇怪的事情,我不知道它叫什么,所以我很难找到有关它的信息,因此我的问题在这里。
我遇到了一个问题,如果您创建任何类型的数组并在 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】:Class的toString方法调用Class的getName方法
返回实体的名称(类、接口、数组类、 此 Class 对象表示的原始类型或 void)作为 细绳。如果此类对象表示的引用类型不是 数组类型,然后返回类的二进制名称,如 由 Java™ 语言规范指定。
如果此类对象表示原始类型或 void,则 返回的名称是一个等于 Java 语言关键字的字符串 对应于原始类型或void。
如果这个类对象代表一个数组类,那么内部 名称的形式由前面的元素类型的名称组成 一个或多个 '[' 字符表示数组的深度 嵌套。元素类型名称的编码如下:
元素类型编码 布尔 Z 字节 B 字符 C 类或接口 L类名; 双D 浮动 F 诠释我 长J 短裤类或接口名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】:类名开头的[
应读作“...的数组”,“...”是[
后面的内容; @emory 引用并链接到的 Class.getName()
的文档中详细说明了以下内容的约定。
Section 4.3.1 of the Java Language Specification 开始:“对象是类实例或数组。”这表明数组不是类实例。 (也许这就是@TigerTrussell 在他的回答中得到的。)但是,Section 10.8 开始:“每个数组都有一个关联的 Class 对象,与具有相同组件类型的所有其他数组共享。数组类型的直接超类是目的。”这表明数组,即使不是真正的类实例,也非常接近。
不幸的是,Java 的语法规则禁止从数组类型继承:
public class MyFancyArray extends int[] // ILLEGAL
// ...
请注意,这是一个语法约束;没有概念或语义障碍(许多其他 OO 语言都允许这样做)。
【讨论】:
【参考方案3】:这只是一些愚蠢的命名约定。如果它们更具人类可读性会更好:class byte[]
,class java.lang.Integert[][]
【讨论】:
【参考方案4】:这些是基础类型对象的名称。 [
表示它是一个数组,后面的字母表示数组类型。 B=byte、I=integer、D=double 等。如您所见,“L”用于类类型成员。
【讨论】:
【参考方案5】:数组没有类,它们只是数据结构。唯一拥有类的东西是从包含在数组中的 Object 扩展而来的东西。
【讨论】:
对不起——你得到奇怪输出的原因是Java组织其数据结构的底层方式。字母对应数据类型,前面的'['表示是数组。 数组绝对是对象。例如,这样做非常有意义:int[] a = new int[3]; System.out.println(a.getClass().getName());
这取决于你的观点。说int[].class
是完全合法的。
我不同意。如果数组没有类,那么 Class 方法是否有一个 isArray 方法,该方法确定此 Class 对象是否表示数组类。 -- download.oracle.com/javase/1,5.0/docs/api/java/lang/…
@TigerTrussell - 谁说你必须是一个对象才能上课? int
不是正确的对象(尽管有自动装箱),但它仍然有一个类。如果你想了解它的技术,每个对象(和基元)只是一个为给定类型分配的连续内存块。以上是关于具有数组类型的 getClass 方法 Java的主要内容,如果未能解决你的问题,请参考以下文章