【问题标题】:What is the class of int array? [duplicate]int 数组的类是什么? [复制]
【发布时间】:2017-11-12 05:02:54
【问题描述】:

问题1: 我有一个疑问,如果我们只能创建类的对象,那么我们如何能够创建原始数据类型的对象,例如 int、char 等。

问题2: 现在假设 Ankit 是一个类,如果我写

Ankit a=new Ankit();
System.out.println(a.getClass().getName());

它会给我一个类名。另外,如果我写

System.out.println(Ankit.class);

那么它也会给出类名。但是如果我写

int ar[]=new int[10];
System.out.println(ar.getClass().getName());
System.out.println(int.class); 

然后我得到输出:

[I 和 int

为什么会这样?在这里,我也应该得到与 int ar 的类名相同的输出,那么为什么不同的输出以及什么是 [I?

【问题讨论】:

  • 提示:不要将数组类型的变量声明为int ar[](尽管Java语法允许这样做),而是将它们声明为int[] ar。然后你会发现你最好写System.out.println(int[].class),因为这是正确的数组类型。
  • 关于“问题1”:不能声明primitive类型的对象。原始类型的本质是它们不是面向对象的。您只能创建 reference 类型的对象。

标签: java class object


【解决方案1】:

数组与toString 实现略有不同。

这是您看到的文档getName docs

以字符串形式返回此 Class 对象表示的实体(类、接口、数组类、原始类型或 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

【讨论】:

  • 并且原语具有非 FQN 标识符,例如 Z 用于布尔值和 I 用于 int
  • @Rogue 完全正确。刚才也提到了。
  • Java 文档说:“如果此类对象表示原始类型或 void,则返回的名称是与原始类型或 void 对应的 Java 语言关键字相等的字符串。”但如果我写 int i=10; System.out.println(i.getClass().getName());那么它给出了编译时错误,为什么会这样?
  • @Ankit 因为你不能调用原始类型的方法。
  • 原语没有可调用的方法。试试Integerint[] 看看那些生效
【解决方案2】:

您的第二个 sn-p 与您的第一个 sn-p 不同。相反,您正在打印

  1. int 数组的类名
  2. 原始 int 的类名

您应该将 sn-p 的最后一行更改为:

System.out.println(int[].class); 

使其打印与上面的行相同的内容。

关于您问题的第二部分:这就是 java 表示数组的类名的方式。

  • int 的一维数组是[I
  • int 的二维数组是[[I
  • 您的班级Ankit 的一维数组是[LAnkit;(您可以使用System.out.println(Ankit[].class); 观察)

【讨论】:

    猜你喜欢
    • 2015-02-18
    • 1970-01-01
    • 2014-05-18
    • 2020-06-05
    • 2012-04-12
    • 2012-10-19
    • 2016-06-08
    • 2020-12-03
    • 1970-01-01
    相关资源
    最近更新 更多