【问题标题】:What is the point of a constructor in Java [duplicate]Java中构造函数的意义是什么[重复]
【发布时间】:2014-07-28 11:25:25
【问题描述】:

在下面的代码中,仅在构造函数中创建数组是否有任何优点/缺点/原因,即我应该注意的下面两个 sn-ps 代码之间有什么区别?

仅在构造函数中。

public class multidimensionalarraysExp {

    public multidimensionalarraysExp() {
        int[][] intArray = new int[][]{{1, 2, 3},{4, 5, 6},{7, 8, 9}};
    }
}

与此相比:

public class multidimensionalarraysExp {
    private int[][] intArray;

    public multidimensionalarraysExp() {
        intArray = new int[][]{{1, 2, 3},{4, 5, 6},{7, 8, 9}};
    }
}

我假设这是因为如果我在构造函数中创建它,我不能说它是公共的还是私有的等等。那么这是否默认为某些东西?

我当然可以这样做,但是为什么首先要有构造函数呢?

public class multidimensionalarraysExp {
        private intArray = new int[][]{{1, 2, 3},{4, 5, 6},{7, 8, 9}};

        public multidimensionalarraysExp() {

        }
    }

一些基本问题,但我不明白为什么甚至需要构造函数.....

【问题讨论】:

  • 我建议投反对票是因为这样一个问题是任何面向对象语言中“基本培训”的一部分,所以你表示你还没有学过关于对象,因此要求接受 OOP 基础知识的培训。
  • 作为一个实例变量,它可以在我们创建多维arraysExp对象时设置和获取,否则它仅限于一个范围。
  • 不,我问的是为什么在很多情况下你真的不需要构造函数时。我相信这是一个有效的问题。

标签: java multidimensional-array constructor


【解决方案1】:
public multidimensionalarraysExp() {
    int[][] intArray = new int[][]{{1, 2, 3},{4, 5, 6},{7, 8, 9}};
}

这里的数组只能在构造函数中访问,因为它是构造函数的局部变量。

如果您在类级别声明数组,则可以在整个类中访问它,但在以下情况下,您会在使用默认构造函数创建类实例时对其进行初始化。

public multidimensionalarraysExp() {
    intArray = new int[][]{{1, 2, 3},{4, 5, 6},{7, 8, 9}};
}

因此,如果您创建 new multidimensionalarraysExp(),您的数组将被初始化。

为什么首先要有构造函数?

它只会在创建实例之后才为变量赋值,而不是在第二种情况下。

如果你想为不同的类实例分配不同的数组值,你可以将数组作为参数传递给构造函数。

 public multidimensionalarraysExp(int[][] intArray) {
        this.intArray = intArray;
    }

【讨论】:

    【解决方案2】:

    在第一个中,您将数组声明为局部变量,因此它只能在构造函数内部访问。

    在第二种情况下,整个班级都可以访问该数组(private)。

    根据answer(根据您的情况改编),有一些理由更喜欢使用第三种方式:

    • 没有区别 - 实例变量初始化实际上是由编译器放入构造函数中
    • 第三个 sn-p 更具可读性
    • 您不能使用第三个 sn-p 进行异常处理
    • 另外还有一个初始化块,它也由编译器放入构造函数中。

    【讨论】:

    • 我知道这是正确的方法,但为什么呢?在我展示的第三个示例中 - 为什么这不是一种有效的方法?那不是全班都可以使用的吗?
    • 所以就是这样,因为它是:)
    • @Danrex 我很抱歉。经过一番研究,我发现我错了。在这一点上,我不会特别推荐一个,因为两者都有优点/缺点。阅读this了解更多信息。
    【解决方案3】:

    在第一个sn-p中,你的数组是一个局部变量,所以在这个类的其他方法中是不可用的。

    在您的情况下,在构造函数中初始化数组(第二个 sn-p)或在声明字段时初始化它(第三个)没有区别。在构造函数中初始化数组的唯一原因是如果你想传递一些参数。

    根据oracle's docs,双向都可以,没有偏好。

    【讨论】:

      【解决方案4】:

      构造函数的意义在于初始化对象的状态。

      您可以使用构造函数来初始化数组,例如,如果数组的长度或其值会根据传递给构造函数的值而改变。

      作为一个例子,一个类 Card 可以接受一个花色,它将用给定的花色初始化所有 12 张牌。

      但是,如果数组没有根据构造函数的类型或传递给它的值而改变,那么在构造函数内部初始化数组是没有意义的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        • 2013-04-25
        • 2021-09-12
        • 2011-03-31
        • 1970-01-01
        相关资源
        最近更新 更多