【问题标题】:How to access this parameter of an object如何访问对象的此参数
【发布时间】:2014-09-01 13:33:50
【问题描述】:

所以,我有两节课。一个类称为 Data,另一个类称为 Part。 (用于库存跟踪程序)。数据处理信息的序列化和程序操作的数据处理。 Part 本质上只是包含一个构造函数。我知道这不是最理想的面向对象设置,但以后的程序功能将使这种设置非常方便。

无论如何,Part 类有以下构造函数:

Part(String partName, String Make, String PartNumber,
        String altPartNumber, BigDecimal price, int quantity,
        String description, boolean automotive, boolean marine,
        boolean industrial)
{

}

Data 类包含这个 ArrayList,稍后将在 JTable 中使用:

protected ArrayList<Part> parts;

Part 类中有几个访问器方法,其中包括访问存储在 ArrayList 中的 Part 对象的每个参数的方法。预期的功能是能够访问(以及稍后设置,如果您预见到任何潜在的困难,任何提示也会有所帮助)parts ArrayList 中任何给定 Part 对象的参数。

我尝试执行此操作的当前代码:

protected String getPartName(Part part)
{
    return part.partName;
}

NetBeans 抱怨它在 Part 类中找不到变量 partName。

我该如何解决这个问题? / 为什么要这样做?

编辑:新问题:

我有以下 switch 语句:

@Override
public Object getValueAt(int row, int column)
{
    Part part = getRow(row);         // Gets the part in question

    switch(column)
    {
        case 0:
            return Part.getPartName(part);
        case 1:
            return Part.getMake();
        case 2:
            return Part.getPartNumber();
        case 3:
            return Part.getAltPartNumber();
        case 4:
            return Part.getPrice();
        case 5:
            return Part.getQuantity();
        case 6:
            return Part.isAutomotive();
        case 7:
            return Part.isMarine();
        case 8:
            return Part.isIndustrial();

        default:
            return null;     // This shouldn't ever be called.
    }
}

但是,NetBeans 现在抱怨“不能从静态上下文引用非静态方法 getPartName。我应该将我的访问器/修改器方法声明为静态吗?

【问题讨论】:

  • 您是否将 partName 声明为 Part 类中的变量?我不确定您是否故意将构造函数留空
  • @Steven 我知道这应该是基本的 Java OOP 知识,但我画的是空白。我一定只是累了。如果我创建了一个 partName 变量,它不会与 Part 对象的任何特定实例相关联吗?如果没有,我会在类或构造函数中这样做吗?可以用一小段代码解释一下吗?
  • “我知道这不是最理想的面向对象设置” 相反!这是一个非常好的面向对象设计,IMO。
  • @Code-Apprentice 谢谢你,现在清理这些变量名:我知道那个camelCase发生了什么......
  • @Steven 你能看看我的问题编辑吗?

标签: java oop object arraylist visibility


【解决方案1】:

确保在您的 Part 类中声明了 partName 变量,并且它是公共的,并且还在您的构造函数中设置它。最后,Part 类应该是这样的:

public class Part {
    public String partName;

    public Part(String partName, String Make, String PartNumber,
    String altPartNumber, BigDecimal price, int quantity,
    String description, boolean automotive, boolean marine,
    boolean industrial) {
        this.partName = partName;
    }
}

这使得变量partName 对所有其他拥有Part 实例的类可见,方法是通过设置为public。这也会将该变量设置为构造函数中传递的值。

如果您计划以与partName 相同的方式访问它们,您也应该对其他变量执行此操作:

public class Part {
    public String partName, Make, PartNumber, altPartNumber, description;
    public BigDecimal price;
    public int quantity;
    public boolean automotive, marine, industrial;

    public Part(String partName, String Make, String PartNumber,
    String altPartNumber, BigDecimal price, int quantity,
    String description, boolean automotive, boolean marine,
    boolean industrial) {
        this.partName = partName;
        this.Make = Make;
        this.PartNumber = PartNumber;
        this.altPartNumber = altPartNumber;
        this.description = description;
        this.price = price;
        this.quantity = quantity;
        this.automotive = automotive;
        this.marine = marine;
        this.industrial = industrial;
    }
}

现在 NetBeans 应该可以正常编译了。

编辑

这是您新编辑的答案。 (注意:下一次,你应该问一个新问题而不是编辑一个旧问题:))。无论如何,解决方案很简单。在您的代码中,您有一个名为 part(小写“p”)的部分变量,并且还有一个名为 Part(大写“P”)的类,但在您的 switch 语句中,您使用的是像 @987654333 这样的语句@,带有大写的“P”。正因为如此,Java 认为你想访问类Partstatic 方法,而实际上我认为你想访问局部变量part 的实例方法。 p>

tl;博士: 基本上,您正在混合不应该在 Java 等区分大小写的语言中完成的案例。

修改方案:

只需将switch 中的所有Part.whateverMethod(... 更改为part.whateverMethod(...。 您的代码应如下所示:

@Override
public Object getValueAt(int row, int column)
{
    Part part = getRow(row);         // Gets the part in question

    switch(column)
    {
    case 0:
        return part.getPartName(part); // lowercase "part"
    case 1:
        return part.getMake(); // lowercase "part"
    case 2:
        return part.getPartNumber(); // lowercase "part"
    //... do you see what I'm trying to do here?
    // continue to do this for all your other "Part.whateverMethod("

【讨论】:

  • 谢谢,但我刚刚用最后一个问题编辑了我的问题。你能看一下吗?
  • 谢谢,在你说这个之前就想通了,但我很感激我做对了!
  • @HCBPshenanigans 干得好!很高兴知道我帮了一点忙 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
相关资源
最近更新 更多