能够在不引用父类的情况下实例化静态内部类

时间:2017-08-22 10:20:38

标签: java arraylist collections static comparator

在开始之前,我想指出这篇文章并不重复:

How to instantiate non static inner class within a static method

Why instantiation of static nested class object is allowed?

事实上,我想知道为什么它在我的示例代码中表现得很奇怪。 据我所知,我们可以实例化一个静态内部类:

new OuterClass.InnerClass();

但是在我的示例代码中,我能够实例化静态内部类,如:

new InnerClass();

我将把我的示例代码放在这里:

import java.util.*;

class GFG {

static class ListComparator implements Comparator<Integer>{

            @Override
            public int compare(Integer o1, Integer o2){
                if(o1>o2){
                    return -1;
                }
                else if(o1<o2){
                    return 1;
                }
                else
                    return 0;
            }
}

public static void main (String[] args) {
    //code
    List<Integer> list = new ArrayList<Integer>();
    list.add(3);
    list.add(1);
    list.add(2);
    list.add(4);
    Collections.sort(list,new ListComparator());    
    for(Integer i : list){
        System.out.println(i);
    }

 }
}

上面的代码运行没有任何错误,我按降序输出。 任何人都可以解释我如何能够直接实例化这样的静态内部类: new ListComparator();

我在这种情况下期待错误,但对输出感到惊讶。我知道我的静态内部类实现 Comparator 接口,但我想知道使它静态会引起与静态类的行为的冲突。 但令人惊讶的是没有发生,我很好奇为什么它没有发生?

2 个答案:

答案 0 :(得分:6)

答案很简单,静态内部类与main方法的范围相同。因此,没有必要从GFG明确引用它(尽管你可以,如果你想)。

这样想。如果在GFG中有另一个静态方法,比如static void foo(),你就不需要在main方法中将其称为GFG.foo()。对于静态内部类来说,它是一回事。

答案 1 :(得分:2)

当你创建一个 static 内部类时,你会说内部类不需要引用它的封闭类。使其静态不会禁止实例化。

有关详细信息,请查看Joshua Bloch撰写的Effective Java第22项。这是一段摘录:

  

静态成员类是最简单的嵌套类。最好的想法   作为一个普通的类,恰好在另一个类中声明,并且可以访问所有封闭类的成员,甚至是那些声明为private的成员。 :一种   static member class是其封闭类的静态成员,并遵循与其他静态成员相同的可访问性规则。如果它被声明为私有,则只能在封闭类中访问,等等。