【问题标题】:Why is this causing an error- Class within method Java为什么这会导致错误 - 方法 Java 中的类
【发布时间】:2013-12-17 10:15:39
【问题描述】:

所以我想知道为什么这会返回错误:“无法从类型 Compn 对非静态方法 comparen(args) 进行静态引用”。我显然无法将方法 comparen() 设为静态,所以不确定出了什么问题。

//8 bit comparison. bit 7 and bit 15 are highest.
public static boolean[] comparator(boolean bit0, boolean bit1, boolean bit2,
                boolean bit3, boolean bit4, boolean bit5,
                boolean bit6, boolean bit7,
                boolean bit8, boolean bit9, boolean bit10,
                boolean bit11, boolean bit12, boolean bit13,
                boolean bit14, boolean bit15) {

    boolean[] comparatorOUT = new boolean[3]; //0 == A>B, 1 == B>A, 2 == A==B
    boolean[][] currVal =  new boolean[16][3]; // [0] = highest bit.

    class Compn {
        boolean[] comparen(boolean curr1, boolean curr2, boolean curr3, boolean b1, boolean b2) {
            boolean[] storage = new boolean[3];
            storage[0] = curr3 && (((!xor(curr1, curr2) && b1) && !(!xor(curr1, curr2) && b2)) || curr1 && !curr2);
            storage[1] = curr3 && (((!xor(curr1, curr2) && b2) && !(!xor(curr1, curr2) && b1)) || !curr1 && curr2);
            storage[2] = curr3 && (!storage[0] && !storage[1]);
            return storage;
        }   
    }
    currVal[0] = Compn.comparen(false, false, true, bit7, bit15);
    currVal[1] = Compn.comparen(currVal[0][0], currVal[0][1], currVal[0][2], bit6, bit14);
    currVal[2] = Compn.comparen(currVal[1][0], currVal[1][1], currVal[1][2], bit5, bit13);
    currVal[3] = Compn.comparen(currVal[2][0], currVal[2][1], currVal[2][2], bit4, bit12);
    currVal[4] = Compn.comparen(currVal[3][0], currVal[3][1], currVal[3][2], bit3, bit11);
    currVal[5] = Compn.comparen(currVal[4][0], currVal[4][1], currVal[4][2], bit2, bit10);
    currVal[6] = Compn.comparen(currVal[5][0], currVal[5][1], currVal[5][2], bit1, bit9);
    currVal[7] = Compn.comparen(currVal[6][0], currVal[6][1], currVal[6][2], bit0, bit8);

    comparatorOUT[0] = currVal[0][0] || currVal[1][0] || currVal[2][0] || currVal[3][0] || currVal[4][0] || currVal[5][0] || currVal[6][0] || currVal[7][0];
    comparatorOUT[1] = currVal[0][1] || currVal[1][1] || currVal[2][1] || currVal[3][1] || currVal[4][1] || currVal[5][1] || currVal[6][1] || currVal[7][1];
    comparatorOUT[2] = !comparatorOUT[0] && !comparatorOUT[1];

    return comparatorOUT;
}

【问题讨论】:

  • 为什么不能将boolean[] compare设为static

标签: java class methods static binary


【解决方案1】:

只有在方法是静态的时候才能这样调用。

Compn.comparen

你应该这样做

Compn c = new Compn();
currVal[0] = c.comparen(false, false, true, bit7, bit15);

或更改为静态。

为什么不把 Compn 类放在方法之外呢?

【讨论】:

  • 我希望方法本身是“自给自足的”。我正在尝试用 Java 设计电路,其中方法代表子电路。在子电路中定义#comparen 使其更易于重用。不过谢谢,这有帮助。
【解决方案2】:

你是对的,你不能在Comp 中创建comparenstatic。但这也意味着你不能像静态一样调用它。

从您的示例中,您根本不清楚为什么需要 Compn 类。您可以将comparen 设为comparator 的静态同级方法。

【讨论】:

    【解决方案3】:

    你声明了一个本地类,它是一个内部类的类型,它不能声明静态成员。 Java 有这个限制是有原因的:实际上根本没有必要声明你的类。

    comparen 方法移动到您的比较器 方法的兄弟,然后使其成为static。它不捕获任何本地状态,因此没有什么迫使您首先介绍该类。

    如果您想将comparencomparator 封装在一起,那么您需要一个单独的类两者。这是使用 Java 语言特性满足您的目标的唯一方法。

    【讨论】:

    • 如何创建“兄弟”方法?请记住,我希望将所有内容都封装在比较器方法中。
    • comparator(语法树中的兄弟姐妹)并排声明。我的回答已经表明我牢记您的愿望,即使您的问题中没有说明。
    • 对不起,我真的不明白你会怎么做。你能发布一些示例代码吗?
    • “那样做”是什么意思?将comparencomparator 并排放置?
    • 是的...你的意思是让它们都成为静态方法吗?
    【解决方案4】:

    这是因为方法comparen 是类Compn 的实例方法。如果不创建该类的实例,就不能调用实例方法。

    【讨论】:

      猜你喜欢
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多