Java中嵌套类的目的是什么?

时间:2013-10-04 11:58:34

标签: java inner-classes nested-class

我在Oracle Website看到了关于Java的示例代码?

public class Parent {
    class InnerClass {
        void methodInFirstLevel(int x) {
           // some code
        }
    }

    public static void main(String... args) {
        Parent parent = new Parent();
        Parent.InnerClass inner = parent.new InnerClass();
    }
}
  • 构造parent.new InnerClass()的目的是什么?
  • 什么样的课程适合这种建设?

标题可能会产生误导:我理解这个结构的所有内容。

我只是不明白使用此Java功能的位置和时间。

我发现了另一种语法:Java: Non-static nested classes and instance.super()

有很多关于这个结构的参考文献,但没有关于应用程序的内容。

[参考文献]

3 个答案:

答案 0 :(得分:2)

  

parent.new InnerClass()的目的是什么?

这是为了演示 - 使用这种机制构建内部类很少见。通常情况下,内部类只能像往常一样使用new InnerClass()创建外部类。

  

什么样的课程适合这种建设?

查看Map.Entry<K,V>的经典示例。在这里,您可以看到一个名为Entry的内部类,它应该由实现Map的所有类创建。

答案 1 :(得分:1)

我在这里看到许多解释内部类的使用的答案,但据我所知,问题是关于特定的构造parent.new InnerClass()

该语法的原因非常简单:内部类的实例必须属于周围类的实例。但由于main是静态方法,因此没有周围的Parent对象。因此,您必须明确指定该对象。

public static void main(String[] args) {
    // this results in an error:
    // no enclosing instance of type Parent is available
    InnterClass inner = new InnerClass();

    // this works because you specify the surrounding object
    Parent parent = new Parent();
    InnerClass inner = parent.new InnerClass();     
}

我正在标准包中搜索这个构造的用法,但到目前为止我还没有找到一个例子。

答案 2 :(得分:0)

内部类嵌套在其他类中。普通类是包的直接成员,是顶级类。 Java 1.1提供的内部类有四种形式:

  • 静态成员类
  • 会员类
  • 本地课程
  • 匿名课程

内部类最重要的特性是它允许您将事物转换为通常不会变成对象的对象。这使得您的代码比没有内部类的代码更加面向对象。

public class DataStructure {
    // create an array
    private final static int SIZE = 15;
    private int[] arrayOfInts = new int[SIZE];

    public DataStructure() {
        // fill the array with ascending integer values
        for (int i = 0; i < SIZE; i++) {
            arrayOfInts[i] = i;
        }
    }

    public void printEven() {
        // print out values of even indices of the array
        InnerEvenIterator iterator = this.new InnerEvenIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.getNext() + " ");
        }
    }

    // inner class implements the Iterator pattern
    private class InnerEvenIterator {
        // start stepping through the array from the beginning
        private int next = 0;

        public boolean hasNext() {
            // check if a current element is the last in the array
            return (next <= SIZE - 1);
        }

        public int getNext() {
            // record a value of an even index of the array
            int retValue = arrayOfInts[next];
            //get the next even element
            next += 2;
            return retValue;
        }
    }

    public static void main(String s[]) {
        // fill the array with integer values and print out only
        // values of even indices
        DataStructure ds = new DataStructure();
        ds.printEven();
    }
}