【问题标题】:Able to instantiate static inner class without referring to parent class能够在不引用父类的情况下实例化静态内部类
【发布时间】:2018-01-30 14:03:20
【问题描述】:

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

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 接口,但我想知道将其设为静态会引发与静态类行为的冲突。 但令人惊讶的是没有发生,我很好奇为什么没有发生?

【问题讨论】:

  • 为什么会出现错误? ListComparator 在范围内,因此无需限定它。这很像访问静态变量或方法。
  • @Dukeling 感谢您的回复。实际上我想知道我如何能够实例化,特别是如果那是静态类?如何实例化一个静态类? ListComparator 在这里是一个静态内部类。
  • “我如何能够实例化,特别是如果那是静态类” - 那不就是让这成为 this post you linked 的副本吗?
  • 好吧,你的意思是说一个静态内部类被当作一个方法来对待。我说的对吗?
  • 就范围而言,是的。

标签: java arraylist collections static comparator


【解决方案1】:

当你创建一个 static 内部类时,你是在说内部类不需要对其封闭类的引用。将其设为静态不会禁止实例化。

有关更多详细信息,请查看 Joshua Bloch 撰写的 Effective Java 的第 22 条。摘录如下:

静态成员类是最简单的嵌套类。最好想到 作为一个普通类,恰好在另一个类中声明,并且可以访问所有封闭类的成员,即使是那些声明为私有的。 一个 静态成员类是其封闭类的静态成员,并遵守与其他静态成员相同的可访问性规则。如果它被声明为私有,则只能在封闭类中访问,依此类推。

【讨论】:

    【解决方案2】:

    答案很简单,就是静态内部类和main方法在同一个范围内。因此,没有必要从 GFG 显式引用它(尽管您可以根据需要)。

    这样想。如果您在 GFG 中有另一个静态方法,例如 static void foo() ,则无需在主方法中将其称为 GFG.foo() 。静态内部类也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      相关资源
      最近更新 更多