Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态内部类-怪异_Java_Static_Inner Classes - Fatal编程技术网

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>