【问题标题】:Initializing array with values from constructor parameter - Impossible to initialize?使用构造函数参数中的值初始化数组 - 无法初始化?
【发布时间】:2012-02-19 19:14:01
【问题描述】:

我在 javaprogrammingforums.com 上问过同样的问题,但他们的网站现在似乎已关闭。所以我看不到我得到了什么回应(如果有的话)。无论如何,我严重坚持这个 Java HW 任务。到目前为止,我所拥有的在完成方面看起来不错,现在它只是让正确的值出现。假装我有这个:

(这只是2类中带构造函数的2个部分,另一个是“测试者”)

//private variables
boolean myP;
boolean myPla;
boolean myGl;
boolean myCa;

double myPlot;
int myCrust;

double myReduct;
double myNet;
double myGross;

boolean [] trshIt = {myP, myPla, myGl, myCa};
double [] CO2TrashEmissions = {184.0, 25.6, 46.6, 165.8};

//constructor
CO2FromWaste(int crust, boolean p, boolean pl, boolean gl, boolean ca)
{
    myPlot = 1018.0;
    myCrust = crust;
    myP = p;
    myPl = pl;
    myGl = gl;
    myCa = ca;
}

我的问题是布尔数组 trshIt。由于我将变量放入尚未初始化的数组中,因此它为这些变量提供了默认值 false。如果我先把它放在构造函数中,那么我会收到一个错误,抱怨找不到变量 trshIt;指向我正在调用该变量的实例。所以我在不同的领域尝试了不同形式的它,我现在就像被困在一个迷宫里,试图让那个阵列正常工作。我需要我能得到的所有帮助。想法?

【问题讨论】:

  • 不要在多个地方发布同一个问题。此外,您添加了许多标签,除了最重要的标签:“Java”...
  • 嗯。好吧,我所在的另一个论坛已关闭,这是我在这里的第一个帖子......我会修复标签。

标签: java arrays constructor private


【解决方案1】:

它不起作用,因为 trshIt 会在它们在构造函数中初始化之前从字段中获取它的值。

在每个其他变量应该工作之后在构造函数中初始化 trshIt。

另外,由于 CO2TrashEmissions 从外观上看是恒定的(也许 myPlot 也是如此?),您可能应该将其声明为 static 和 final 以防止它发生变化。虽然它不会阻止对元素本身的修改。

private static final double[] CO2TrashEmissions = {184.0, 25.6, 46.6, 165.8};
//Fields....
boolean[] trshIt;

//constructor
CO2FromWaste(int crust, boolean p, boolean pl, boolean gl, boolean ca)
{
    myPlot = 1018.0;
    myCrust = crust;
    myP = p;
    myPl = pl;
    myGl = gl;
    myCa = ca;

    trshIt = new boolean[]{myP, myPla, myGl, myCa};
}

另外,请注意,由于布尔值是文字,因此更改您的 my* 变量之一不会更改数组中的相应元素,这可能是一个问题,具体取决于您的程序正在执行的操作。

【讨论】:

  • 我主要只是利用arrayLists来计算和打印信息。布尔变量确实发生了应有的变化。我不认为我可以在脚本中使用静态和最终等术语,因为它还没有教给我。但相信我,如果可以的话,我会全力以赴。有用的东西越多越好。如果我处于类似情况,我会参考这个并且我正在为此构建脚本。
  • 我的意思是在构造函数之外,当您使用操作对象的方法修改字段时——您一定会在稍后的课程中了解它。祝你好运,不要犹豫,学习比你需要的更多的东西。
【解决方案2】:

trshIt声明为类的成员,但在构造函数中对其进行初始化,如下所示:

boolean [] trshIt;
double [] CO2TrashEmissions = {184.0, 25.6, 46.6, 165.8};

//constructor
CO2FromWaste(int crust, boolean p, boolean pl, boolean gl, boolean ca)
{
    myPlot = 1018.0;
    myCrust = crust;
    myP = p;
    myPl = pl;
    myGl = gl;
    myCa = ca;

    trshIt = new boolean[4];
    trshIt[0] = myP;
    trshIt[1] = myPla;
    trshIt[2] = myGl;
    trshIt[3] = myCa;
}

【讨论】:

  • 嗯,很好的尝试,虽然我已经尝试过了,但在 trshIt 数组上的第一个波浪形括号之前出现“非法表达式开始”错误。我不清楚我为什么会得到这个。
  • 你可能需要trshIt = new boolean[] {myP, myPla, myGl, myCa};
  • 只有在声明变量时才可以使用快捷数组表示法,即可以使用boolean[] a = {true, false};,但不能使用boolean[] a; a = {true, false};
  • 哎呀。好的。已编辑以解决该问题。
  • 成功了!虽然我不得不将 boolean [] trshIt; 更改为 boolean [] trshIt = new boolean [4]; 并通过为每个索引分配变量构造函数。终于在终端上获得了魔力。
【解决方案3】:

你不能这样做的任何原因:

//private variables
boolean myP;
boolean myPla;
boolean myGl;
boolean myCa;

double myPlot;
int myCrust;

double myReduct;
double myNet;
double myGross;

boolean [] trshIt;
double [] CO2TrashEmissions;

//constructor
CO2FromWaste(int crust, boolean p, boolean pl, boolean gl, boolean ca){

    myPlot = 1018.0;
    myCrust = crust;
    myP = p;
    myPl = pl;
    myGl = gl;
    myCa = ca;
    trshIt = new boolean[4];
    trshIt[0] = myP; trshIt[1] = myPla;
    trshIt[2] = myGl; trshIt[3] = myCa;

    double [] CO2TrashEmissions = {184.0, 25.6, 46.6, 165.8};
}

在 Java 中,原语(int、char、boolean)是按值分配的,所以如果你这样做

boolean b = true;
boolean[] a = { b };
b = false;

System.out.println( ( a[0] == true ) ? "true" : "false" );

将打印“true”,因为b = false; 不会更改a 数组中的值(因为它不会存储指向b 的“指针”,而是b 中的值。

【讨论】:

  • 嗯,我做了你的风格,我设法通过了第一个错误。但是运行脚本时,当我在 for 循环中询问它的长度时,我现在收到一个错误,即 trshIt 为空。即使在调试器中查看它的值,它也会报告它为空。我以前从未有过这样的事情。想法?顺便感谢您帮助我解决错误 1。
  • 只有在这个特定的构造函数没有被调用的情况下才可以为null。你有多个构造函数,还是在任何地方都使用new CO2FromWaste() 而不是new CO2FromWaste( crust, p, pl, gl, ca )
  • 我只有一个构造函数,并且我多次使用带有参数的 new CO2FromWaste 作为数组列表中的对象。
  • @Michael:您应该接受这个答案,并使用导致新问题的代码发布另一个问题。
  • 别担心,现在解决了。谢谢user1000959。 (还不能做有用的答案)
猜你喜欢
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多