【问题标题】:Can we create an object without parentheses?我们可以创建一个没有括号的对象吗?
【发布时间】:2018-01-13 19:57:31
【问题描述】:

根据this site,创建Java对象的语法是:

<JavaType> <variable> = new <JavaObject>();

虽然您在创建 Array 对象时不使用任何括号,而是键入包含每个维度长度的括号。

例子:

String[][] stringMatrix = new String[5][10];

我想知道的是,这种语法是否专门用于创建 Array 对象,或者我可以创建一个自定义类,其对象的创建方式与通常不同

new <JavaObject>();

声明。

【问题讨论】:

  • 您链接到的页面显然不是一个很好的资源。
  • 在所有语言中都有一套关于如何创建对象和数组或声明任何变量的规则。在java中也一样。我不确定,您具体在寻找什么
  • 您为什么要寻找不同的做事方式?你知道的方式有什么问题?它不像它复杂或过长。
  • 我只是想知道是否可以使用该语言

标签: java arrays object syntax new-operator


【解决方案1】:

new关键字用于为特定类型分配内存,后面是new关键字。

MyClass obj = new MyClass();

上面一行将为MyClass创建一个对象(分配内存),并通过调用默认构造函数来初始化成员变量。

但是,下面这行代码只会分配内存并使用默认值null初始化数组的每个元素。

MyClass[][] objMatrix = new MyClass[5][10];

所以,我们只是声明了一个大小为5x10(分配内存)的数组,但是数组中的每个元素都需要一些对象引用(因为目前它们有null 引用)。因此,出于这个原因,您需要通过创建 MyClass 的对象并将它们分配给每个元素来初始化每个 objMatrix 数组元素。

objMatrix[0][0] = new MyClass();

【讨论】:

    【解决方案2】:

    它专门用于创建数组。你的类被括号困住了。

    【讨论】:

      【解决方案3】:

      您不能创建更改new 运算符工作方式的自定义类。但是,在某些特殊情况下,可以在没有通常的 new 运算符的情况下创建对象。

      例如

      String[] array = { "foo", "bar", "baz" };
      Integer value = 42;
      

      证明您可以在变量初始值设定项中创建不带 new 关键字的数组,使用 String 对象使用文字和自动装箱原始值到它们的对象对应物,而无需通常的 new 语法,但当然,这不是可以使用自定义类型。

      在不使用new 运算符的情况下创建对象的另一种可能性是反序列化它们,如果它们是Serializable,这也适用于自定义类型。

      从 Java 8 开始,如果您有适当的上下文,则可以使用构造函数引用,例如

      BigDecimal[] array = new BigDecimal[20];
      Arrays.setAll(array, BigDecimal::new);
      System.out.println(Arrays.toString(array));
      

      这里,BigDecimal::new 是对BigDecimal 的构造函数的引用,并且从上下文中暗示,即Arrays.setAll,该函数必须能够使用int 值,如setAll 方法将为每个数组元素评估它,传递数组索引,因此我们在本例中使用升序初始化数组。

      另一个例子是

      BigDecimal[] array = Stream.of("1.23", "4.56", "7.89")
                                 .map(BigDecimal::new)
                                 .toArray(BigDecimal[]::new);
      System.out.println(Arrays.toString(array));
      

      从上下文中暗示.map(BigDecimal::new) 步骤中使用的构造函数必须使用String,因为它将针对每个流元素进行评估,最终使用与第一个示例不同的构造函数。

      BigDecimal 是一个普通类,如果自定义类具有匹配的构造函数,这些示例也可以与自定义类一起使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-29
        • 2021-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-03
        • 2014-08-28
        • 1970-01-01
        相关资源
        最近更新 更多