Java 静态内部类-怪异
我的代码:Java 静态内部类-怪异,java,static,inner-classes,Java,Static,Inner Classes,我的代码: 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
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{
公共类StringSorter实现了比较器
{
公共StringSorter(){}
公共整数比较(字符串s1、字符串s2)
{
int l1=s1.length();
int l2=s2.length();
返回l1-l2;
}
}
公共静态void main(字符串[]args){
System.out.println(“你好,世界!”);
StringSorter-sorter=新StringSorter();
集合=新树集合(分拣机);
添加(新字符串(“he”));
添加(新字符串(“hel”);
添加(新字符串(“he”));
添加(新字符串(“hello”);
用于(字符串s:集合)
{
系统输出打印项次;
}
}
}
它将投诉一个错误:
“MyTest.java:41:非静态变量无法从静态上下文引用此变量”
删除此行将通过编译。但是,“static main”方法中需要许多字符串对象。String和StringSorter有什么区别
如果我将StringSorter更改为静态内部类,它将被编译为OK。静态内部类如何修复编译错误?
StringSorter
是一个内部类,总是“绑定”到外部类的实例MyTest
(它可以访问其成员、调用其方法等)。因为您试图从静态上下文(静态主方法)实例化它,所以失败了。相反,您可以将内部类设置为静态(如静态公共类StringSorter
)以使其工作
或者,您可以将StringSorter
移动到MyTest
之外,在这种情况下,它们是独立的类。(如果您仍希望将两个类保留在同一个文件中,则必须删除public
修饰符,因为每个源文件只允许一个带有文件名的公共类)
另一种选择是将“测试代码”从主方法移动到
MyTest
(因此是非静态上下文)的某个成员方法中,并调用此方法…,正如dcn所说,您必须将static
关键字添加到StringComparator
(见下文):
公共静态类StringSorter实现比较器
内部类通常是静态的,因为它们通常是实用类(在您的情况下也是如此;StringComparator
帮助您根据字符串的长度来比较字符串)。非常好地解释了如何处理内部类。在代码中,您试图使用main方法中的MyTest.StringSorter
MyTest.main
是静态的,因此它无法访问在其外部Cals中定义的非静态字段、方法和内部类
当使StringSorter
static时,可以从外部类的静态方法调用此内部类
调用原始代码时,您没有使用MyTest
的实例。您正在使用它的一个静态方法。教程中说:
InnerClass的实例可以存在
仅在OuterClass的实例中
并且可以直接访问这些方法
和其封闭实例的字段
希望现在更清楚;-) 你应该用“他”而不是新的字符串(“他”)为什么?^^谢谢你的提醒。我不明白你最后的建议。MyTest的非静态方法无法从main方法调用,该方法是静态的。我的意思是:将所有代码从
main
移动到MyTest
中的某个方法test()
,然后在MyTest.main
中写入new MyTest().test()
…好的,我不清楚。这样,您就可以实例化Mytest
对象,并调用instanciate嵌套类。
public static class StringSorter implements Comparator<String>