Java 像原始数据类型一样的整数数组如何具有字段';长度';?

Java 像原始数据类型一样的整数数组如何具有字段';长度';?,java,arrays,Java,Arrays,当一个原始数据类型(如整数数组)不是一个类时,它怎么可能有一个字段“length”?e、 g int a[] = {1,2,3,4}; int j = a.length; System.out.println(j); 简单:数组不是原语。相反,它们是引用类型的对象 体验这种情况的另一种方法是查看如果将int数组传递到方法中并从方法中修改数组的内容会发生什么。您将看到,这也将修改原始数组对象,所有引用类型(非基元)的变量都会这样做。数组是引用类型的对象,而不是基元 当一个原始数据类型(如整数数组

当一个原始数据类型(如整数数组)不是一个类时,它怎么可能有一个字段“length”?e、 g

int a[] = {1,2,3,4};
int j = a.length;
System.out.println(j);

简单:数组不是原语。相反,它们是引用类型的对象


体验这种情况的另一种方法是查看如果将int数组传递到方法中并从方法中修改数组的内容会发生什么。您将看到,这也将修改原始数组对象,所有引用类型(非基元)的变量都会这样做。

数组是引用类型的对象,而不是基元

当一个原始数据类型(如整数数组)不是一个类时,它怎么可能有一个字段“length”

其他答案解释了数组在Java中不是原始数据类型

虽然数组类型没有声明为类,但它在许多方面与类类似。例如:

  • 每个数组类型都有
    java.lang.Object
    作为其隐式超类
  • 数组实例由引用表示,并且可以(在大多数情况下)保持状态
  • 数组类型有方法;i、 e.
    对象
    声明的方法,以及
  • 您可以对数组实例调用
    getClass()
    ,以获取其
    Class
    对象
如果您考虑一下这些,那么数组的某个状态保持数组的大小在语义上并不是不一致的


Java语言设计者决定数组的长度应建模为一个只读字段,名为
length
,其类型为
int
。这就是它的样子(根据语言语法),这就是它的行为方式

“长度”字段的“不同程度”仅在实现级别上明显可见:

  • length
    字段在数组对象的对象标头中表示,并且
  • 有一个特殊的字节码用于访问数组对象的长度(ARRAYLENGTH-字节码190)

是否可以显式地使“a”看起来像一个对象引用,我的意思是在这里它看起来像一个具有“int”类型引用的原语!但它仍然是一个VM“黑客”,类似于类的
属性。@Ashwyn:数组就像一个空鸡蛋盒。不要把它和鸡蛋混淆——和它所含的东西混淆!长度是一种方法吗?你确定吗?长度不是一个方法,而是一个字段;如果它是一个方法,它的语法应该是length()。另一方面,如果我们处理字符串,length()是一个方法<代码>对象的实例返回true。您还可以
objecta=newint[]{1,2,3,4}因为所有数组都是对象。