1

我从Oracle 网站上看到了这个关于 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()

有很多关于这种结构的参考资料,但没有关于应用程序的资料。

[参考]

4

3 回答 3

2

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

这是为了演示 - 使用这种机制来构造内部类是很少见的。通常,内部类仅由外部类在new InnerClass()像往常一样创建时才创建。

什么样的类适合这种结构?

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

于 2013-10-04T12:16:37.757 回答
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();     
}

我正在标准包中寻找这种结构的使用,但到目前为止我还没有找到一个例子。

于 2013-10-04T12:18:36.887 回答
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();
    }
}
于 2013-10-04T12:02:47.423 回答