我试图在AI中模拟经典的水壶问题。我制作了一个“JugsState”类,它存储了两个水壶的当前状态,即jug1中有多少升水和jug2中有多少升水。另外,我想存储每个水罐可容纳的最大水量,我将从用户那里作为输入。由于这(两个水罐的容量)将始终保持不变,我将它们声明为静态最终变量。但是我无法在构造函数中初始化它们。还有其他替代方法,它维护了类JugsState中max_jug变量的封装吗?
class JugsState
{
private static final int max_jug1,max_jug2;
private int jug1,jug2; //stores the current amount of water in the jugs.
JugsState(int a1,int a2)
{
max_jug1 = a1;
max_jug2 = a2;
}
}
错误:“无法为最终变量max_jug1赋值” 错误:“无法为最终变量max_jug2赋值”
答案 0 :(得分:2)
如果您的班级代表一个水壶,它不应该包含两个水壶的信息。
maxAmount
或volume
应该是该类的非静态成员:
public class Jug {
public final double volume;
private double currentAmount = 0;
public Jug(double vol) { volume = vol; }
...
}
答案 1 :(得分:1)
您无法更改final
变量,因为它是final
。但是,可以将其设置为声明时所需的任何内容。您可以创建一个获取jar最大值的静态函数。它可能是这样的,如果你想从System.in得到它:
private static int getMax(){
System.out.println("Enter the maximum for a jar:");
Scanner in=new Scanner(System.in);
return in.nextInt();
}
然后使用
private static final int max_jug1=getMax();
private static final int max_jug2=getMax();
取代
private static final int max_jug1, max_jug2;
这将在程序运行的剩余时间内设置这些变量。
答案 2 :(得分:0)
如果变量是static
,那么每次调用构造函数时都会重新初始化它。如果是final
,则只能设置一次。
接近你所描述的内容可能如下(请注意静态方法setMaxJug1
)
class jug
{
private static int max_jug1,max_jug2;
private int jug1,jug2; //stores the current amount of water in the jugs.
jug(){
// Your constructor stuff
}
public static void setMaxJug1(int m){
max_jug1 = m;
}
}
然后在主要部分你可以打电话
jug.setMaxJug1(m);
可能还有其他方法可以满足您的要求,但我尝试不要更改过多的代码。
简而言之,一种替代方法是让这些变量不是静态的,如:
class jug
{
private final int max_jug1,max_jug2;
private int jug1,jug2; //stores the current amount of water in the jugs.
jug(int a1,int a2)
{
max_jug1 = a1;
max_jug2 = a2;
}
}
然后你可以使用原始的构造函数。但是,每个jug
对象(通常)都会有max_jug1
和max_jug2
的不同值,具体取决于您在构造函数中传递的值(a1,a2
)。
正确的选择取决于你想如何使用jug对象。