Java 如何将输入(int、String等)转换为相同类型的最终变量?

Java 如何将输入(int、String等)转换为相同类型的最终变量?,java,Java,假设我正在构建一个FoodItem,我想输入一个新项目,我想确保项目的名称不能更改,价格也不能更改,这意味着我不能使用Setter来更改它,但我可以更改数量 我的问题如下:通过在构造函数中声明final名称和COST,我无法在构造函数之外访问它们,例如对于getName或getCost这样的方法。 我希望我的问题足够清楚,如果不只是问,我会回答 我还是java的初学者,所以如果我遗漏了一些明显的东西,请原谅我,我是来学习的 public class FoodItem { private

假设我正在构建一个FoodItem,我想输入一个新项目,我想确保项目的名称不能更改,价格也不能更改,这意味着我不能使用Setter来更改它,但我可以更改数量

我的问题如下:通过在构造函数中声明final名称和COST,我无法在构造函数之外访问它们,例如对于getName或getCost这样的方法。 我希望我的问题足够清楚,如果不只是问,我会回答

我还是java的初学者,所以如果我遗漏了一些明显的东西,请原谅我,我是来学习的

public class FoodItem {

    private int _quantity;

    public FoodItem (String name, int cost, int quantity){   // 
        final String NAME = name;
        final int COST = cost;
        _quantity = quantity;
    }

    public String getName(){ return NAME;} //<-- obviously cannot be found
    public int getCost(){ return _cost;}
    public int getNumber(){ return NUMBER;}
    public void setCost(int newCost){ _cost = newCost;}

名称和成本在错误的地点申报。将其声明移动到声明数量的位置

private int _quantity;
private final String NAME;
private final int COST;

public FoodItem (String name, int cost, int quantity){ 
    NAME = name;
    COST = cost;
    _quantity = quantity;
}

请参阅答案。

要首先回答您的问题,您应该了解数据隐藏的概念

您可以通过不提供access means私有范围而不提供access方法来隐藏数据

所以在这个例子中,你可以写如下

public class FoodItem {

    private int quantity;
    private String name;
    private int cost;

    public FoodItem (String name, int cost, int quantity){   // 
        this.name = name;
        this.cost = cost;
        this.quantity = quantity;
    }

    public String getName(){ return name;}
    public int getCost(){ return cost;}
    public int getQuantity(){ return quantity;}
    // providing a setter so that some one can change the quantity 
    public void setQuantity(int quantity){ this.quantity = quantity;}

}
在上面的例子中,我没有为name和cost提供setter,因此没有人可以访问它们,也没有人可以更改它们的值,除非它们是创建的,并且对于您提到的数量,它可以修改,这就是我提供setter的原因,因此如果有人想要更改数量,那么可以调用obj.setQuantity;方法


希望您了解这个概念。

感谢您的快速回复,我没有在开始时尝试声明它们,因为我假设我无法更改它们或为它们赋值。你能帮我理解为什么这与使用无法工作的Setter不同吗。是否因为只有在收到值后才将设置为final?或者是因为它们是在构造函数中创建的?只能在构造函数创建对象时设置final。我不确定此代码是否符合要求,因为如果将变量声明为final,则会向它们分配一些值,并且不能重新分配新值。final只能在创建对象时设置哎呀,我不知道。谢谢你,泽布。关于这一点的更多信息:这与OP询问的内容无关感谢您的评论,但Yar是正确的,我是专门询问关于“最终”声明的。我同意您的意见,伊曼纽尔,我不知道这一点,因为我过去总是将最终变量声明为静态变量。但我学到了新东西。谢谢你。