java - 静态内部类和非静态内部类的区别?

标签 java oop inner-classes nested-class

我正在阅读《Effective Java 2 - Item 22》,标题中写道:

"Favor static member classes over non-static"

但在本章末尾

Implementations of the collection interfaces, such as Set and List, typically use nonstatic member classes to implement their iterators:

// Typical use of a nonstatic member class
public class MySet<E> extends AbstractSet<E> {
    ... // Bulk of the class omitted

    public Iterator<E> iterator() {
        return new MyIterator();
    }

    private class MyIterator implements Iterator<E> {
        ...
    }
}

我做了一个测试程序,看看它们之间是否有任何区别,这就是。

public class JavaApplication7 {


    public static void main(String[] args) {
        // TODO code application logic here
        JavaApplication7 t = new JavaApplication7();

        Inner nonStaticObject = t.getAClass();
        Sinner staticObject = new JavaApplication7.Sinner();

        nonStaticObject.testIt();
        staticObject.testIt();         
    }

    public Inner getAClass(){
        return new Inner();
    }

    static class Sinner{
        public void testIt(){
            System.out.println("I am inner");
        }
    }

    class Inner{
        public void testIt(){
            System.out.println("I am inner");
        }
    }
}

输出为

I am inner I am inner

所以,他们做了同样的工作。

我想知道为什么在这个例子中使用非静态类?

最佳答案

迭代器通常需要首先引用用于创建它的集合。您可以使用显式提供对集合的引用的静态嵌套类来做到这一点 - 或者您可以只使用隐式具有该引用的内部类。

基本上,如果嵌套类的每个实例都需要封闭类的实例来操作(并且该实例不会更改),那么您不妨将其设为内部类。否则,使其成为静态嵌套类。

关于java - 静态内部类和非静态内部类的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17514712/

相关文章:

java - 将 JSON 字符串转换为 Spinner 的 Arraylist

java - 无法使私有(private)广播方法起作用

oop - 依赖注入(inject)容器看起来不太对劲

swift - 全局声明对象还是仅在需要时声明对象更好

c# - 为什么这段代码要用 long 代替 float 呢?

java - GWT 的各种异步设施

java - 在 Windows/Linux/Mac 上的 Java 程序中对全局热键使用react?

java - 如何在Java中存储新实例的变量

java - 匿名内部类中的 NullPointerException

java - 使用该关键字作为并发锁