gpt4 book ai didi

java - 静态内部类 - 奇怪

转载 作者:行者123 更新时间:2023-11-30 05:03:28 27 4
gpt4 key购买 nike

我的代码:

public class MyTest {
public class StringSorter implements Comparator<String>
{
public StringSorter() {}

public int compare(String s1, String s2)
{
int l1 = s1.length();
int l2 = s2.length();
return l1-l2;
}
}

public static void main(String[] args) {
System.out.println("Hello, world!");

StringSorter sorter = new StringSorter();
Set<String> sets = new TreeSet<String>(sorter);
sets.add(new String("he"));
sets.add(new String("hel"));
sets.add(new String("he"));
sets.add(new String("hello"));

for (String s: sets)
{
System.out.println(s);
}
}
}

它会报错:“MyTest.java:41:不能从静态上下文引用非静态变量”

删除此行将通过编译。然而,我们在“static main”方法中需要许多 String 对象。 String 和 StringSorter 有什么区别?

如果我将 StringSorter 更改为静态内部类,它将编译正常。静态内部类如何修复编译错误?

最佳答案

StringSorter 是一个内部类,并且始终“绑定(bind)”到外部类 MyTest 的实例(它可以访问其成员、调用其方法等... )。由于您尝试从静态上下文(静态 main 方法)实例化它,所以它失败了。相反,您可以将内部类设为静态(例如static public class StringSorter)以使其正常工作。

或者,您可以将 StringSorter 移到 MyTest 之外,在这种情况下,它们是单独的类。 (如果您仍想将这两个类保留在同一个文件中,则必须删除 public 修饰符,因为每个源文件只允许使用一个公共(public)类(带有文件名)。

另一种选择是将“测试代码”从主方法移动到 MyTest 的某个成员方法(因此是非静态上下文)并调用此方法...

关于java - 静态内部类 - 奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5895883/

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