gpt4 book ai didi

java - 接口(interface)的静态上下文错误中引用的非静态变量

转载 作者:行者123 更新时间:2023-12-02 08:08:09 25 4
gpt4 key购买 nike

我对 Java(尤其是接口(interface))相当陌生,我设置了这个简单的比较接口(interface),并希望为其创建一个整数实现。当我编译时,编译器返回一个错误,指出我无法在静态上下文中引用此非静态变量。我理解这个错误......但我不确定为什么会在这种情况下发生。

根据我见过的示例,初始化看起来是正确的。也许我只是需要另一双眼睛来查看这段代码并看看我缺少什么。

感谢任何帮助。

public class Test
{
public static void main(String[] args)
{
Icmp test = new Icmp();
}

public interface Cmp
{
public int cmp(Object x, Object y);
}

class Icmp implements Cmp
{
public int cmp(Object o1, Object o2)
{
int i1 = ((Integer) o1).intValue();
int i2 = ((Integer) o2).intValue();

if(i1<i2)
return -1;
else if(i1==i2)
return 0;
else
return 1;
}
}
}

有问题的行:

    Icmp cmp = new Icmp();

错误:

LabFour.java:20: non-static variable this cannot be referenced from a static context
Icmp cmp = new Icmp();
^

最佳答案

嗯,现在好多了。关键是,接口(interface)和类都不是静态的 - 它们只能使用 Test 实例创建,尝试

Icmp test = (new Test()).new Icmp()

或者,您可以考虑将内部类和接口(interface)设为静态:

public class Test {
public static void main(String[] args) {
Icmp test = new Icmp();
}

public static interface Cmp {
public int cmp(Object x, Object y);
}

static class Icmp implements Cmp {
public int cmp(Object o1, Object o2) {
int i1 = ((Integer) o1).intValue();
int i2 = ((Integer) o2).intValue();

if (i1 < i2)
return -1;
else if (i1 == i2)
return 0;
else
return 1;
}
}
}

另一种选择是摆脱内部类/接口(interface):

interface Cmp {
public int cmp(Object x, Object y);
}

class Icmp implements Cmp {
public int cmp(Object o1, Object o2) {
int i1 = ((Integer) o1).intValue();
int i2 = ((Integer) o2).intValue();

if (i1 < i2)
return -1;
else if (i1 == i2)
return 0;
else
return 1;
}
}

public class Test {
public static void main(String[] args) {
Icmp test = new Icmp();
}
}

正如您所看到的,所有解决方案都是相似的 - 这就是为什么实际代码对于获得合理答案至关重要。

跟进评论:内部类(字面意思是另一个类中的类)意味着该类是封闭对象的一部分。或者,如果它是静态的——封闭类的一部分。非静态内部类的重要一点是它们可以访问封闭对象的成员(字段、方法,包括私有(private)的);因此语法很棘手。

为了使内部类对象能够执行此操作,它存储对封闭对象的隐式引用。

对于接口(interface),正如@Voo正确所说,你永远不会访问任何东西,也永远不会有任何引用——内部接口(interface)总是静态的。

要进一步阅读,请阅读 Kathy Sierra 的书籍。如果您更喜欢硬核规范,或者 JLS。

关于java - 接口(interface)的静态上下文错误中引用的非静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7843549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com