【问题标题】:Java array initialization second variable typeJava数组初始化第二个变量类型
【发布时间】:2019-01-13 12:47:23
【问题描述】:
int[] myArray = new int[5];

大家好, 我知道还有其他方法可以初始化数组,例如:

int[] myArray = {1,2,3,4,5};

但是你能告诉我上面例子中的第二个int 代表什么吗? 我认为第一个“int”已经指定数组具有整数值,不是吗?

【问题讨论】:

  • 是的,它指定值是整数,但不允许有多少值
  • 定义一个有空间容纳 5 个 int 的数组。您可以在此链接上找到更多信息:stackoverflow.com/questions/6222531/…
  • 第一个int 用于声明:此变量将是一个包含原始int 元素的数组。第二个int 用于实例化:您正在分配内存来保存int 元素。
  • 第一个int 是变量myArray 类型规范的一部分。第二个int 是实例化int 数组的Java 表达式的一部分。该表达式为变量的初始化生成了一个正确类型的对象,这确实源于 int 的重复,但这并不意味着它是多余的。
  • @AvoKarato 您提出的替代方案在语法上无效。 new 运算符需要类型作为其操作数,而[5] 不是类型。您可以将重复类型的要求视为一种安全机制,但我更愿意通过查看整个语句来理解它是两个基本独立的部分(变量声明和初始化程序)的复合,每个部分都有自己的规则。 Java 要求在实例化数组的方式上保持一致性

标签: java arrays initialization


【解决方案1】:

int[] myArray = { 1, 2, 3, 4, 5 }; 中的构造作为特殊情况处理。由于声明的类型,编译器知道{ 1, 2, 3, 4, 5 } 正在创建一个int[] 数组。

但是,int 数组的完整数组创建语法是 new int[5](它可能会有所不同),它告诉编译器创建了一个新的 int[] 数组,而不管声明的类型如何:

例如,您可以声明一个Object 变量,并为其分配一个int 数组:

Object myArrayObject = new int[5]; //OK: this creates an int array

而这行不通:

Object myArrayObject = { 1, 2, 3, 4, 5 }; //won't compile

【讨论】:

  • 我记得,int[] myArray = { 1, 2, 3, 4, 5 } 表单并不总是得到支持。我不记得它是什么时候引入的,但我很确定在过去你必须拼出int[] myArray = new int[] { 1, 2, 3, 4, 5 }(你仍然可以这样做)。
  • 但是当int[] my Array = new 任何其他类型而不是int [5] 不会编译时,为什么java 还要我说int AGAIN?跨度>
  • @AvoKarato 这不仅仅是声明int。请记住,您还可以指定大小(new int[5]new int[arraySize] 使用变量)。您是否希望 java 允许您输入 new [5] 或类似的东西?这并没有太大的区别,并且允许开发人员仅在初始化内联时省略 int 的好处是微不足道的。
【解决方案2】:

对于int 和其他原始类型,您是对的,双重声明在很大程度上是多余的。

但是考虑这个例子:

Object [] array = new String[5];

这是有效的 Java 代码(即使它有轻微损坏*)。

在更一般的层面上,它遵循与使用新对象初始化任何变量时相同的模式:

Foo foo = new Foo();

第一个Foo是变量的类型(盒子是什么形状),第二个是实际对象的类型(你放进去的东西是什么形状盒子)

注意:从 Java 10 开始,您可以使用关键字var 声明局部变量,从而无需两次指定类型:

var array = new int[5];

编译器将由此推断array 的类型将与初始化它的对象相同。 (在这种情况下为int[])。

*它被破坏了,因为如果您尝试将除String 之外的任何内容放入数组中,代码只会在运行时失败,而不是在编译期间。

【讨论】:

    【解决方案3】:

    因此,当您键入 new 时,您指定您希望 java 将内存分配给堆。多少内存?啊,是的,足够存储 5 个整数 int[5] 的内存。所以java会在堆上分配足够的连续内存来存储5个整数。

    【讨论】:

      【解决方案4】:
      int[] myArray = new int[5];
      

      意味着您声明了一个可以包含整数值的数组,称为myArrayint[] myArray),然后将其定义为大小为 5 的整数数组(= new int[5];);

      这些步骤是内联的,您也可以分两行执行相同的操作:

      int[] myArray;        // declaration
      myArray = new int[5]; // definition
      

      【讨论】:

        【解决方案5】:

        首先是数组的数据类型。其他的 int 用于初始化数组中的 5 个整数对象

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-10
          • 1970-01-01
          • 2021-05-07
          • 2014-04-05
          • 1970-01-01
          • 2016-11-03
          • 2019-06-08
          相关资源
          最近更新 更多