8

我正在阅读“ Head First Java ”一书,在某些时候它提到内部类实例必须绑定到外部类实例,我已经知道了,但有一个例外:

一种非常特殊的情况——<strong>在静态方法中定义的内部类。但是您可能在整个 Java 生活中都没有遇到过其中任何一种。

我很确定最后一条语句确实是正确的,但是如果编译器允许它发生,则意味着它的存在是有原因的,否则它将是非法的 Java。有人可以向我展示一个有用的例子吗?

4

4 回答 4

3

它可能很特别,也可能不是。

您正在查看方法中可用的本地类:

class Foo {
    static void bar(){
       class MyRunnable implements Runnable {
           public void run() {
               System.out.println("No longer anonymous!");
           }    
        };
       Thread baz = new Thread(new MyRunnable());
    }

}

我见过匿名内部类的用法,例如:

class Foo {
    static void bar(){
        Thread baz=new Thread(new Runnable(){
            public void run(){
                System.out.println("quux");
            }
        }
    }
}

这在技术上是一个内部类(虽然是匿名的)并在静态方法中定义。我个人会创建一个实现 Runnable 的静态嵌套类并执行以下操作:

baz = new Thread(new MyRunnable());

其中MyRunnable定义为:

class Foo {
    static void bar(){
       // SNIP
    }
    static class MyRunnable implements Runnable {
        public void run() {
            System.out.println("No longer anonymous!");
        }    
    }
}
于 2013-10-22T19:30:01.420 回答
1

有些人认为任何可以是静态的方法都应该是静态的。对于这样的人来说,班级的内在美不会有太大的意义。

于 2013-10-22T20:27:19.530 回答
1

这是静态方法中内部类的虚构示例。可以说

  1. 它不需要在静态方法之外声明,因为它在其他地方不需要
  2. 它应该是一个命名类(即不是匿名的),因为它被多次使用

    class Race {
        public static void main(String[] args) throws Exception{
            class Runner implements Runnable {
                final String name;
                long time = -1;
                Runner(String name) { this.name = name; }
                public void run() {
                    try {
                        long start = System.currentTimeMillis();
                        time = -2;
                        System.out.printf("Start %s\n", name);
                        for (int i = 0; i < 10; i++) {
                            Thread.sleep(1000);
                        }
                        System.out.printf("End %s\n", name);
                        this.time = System.currentTimeMillis() - start;
                    } catch (InterruptedException e) {
                        time = -3;
                    }
                }
                long time() { return time; }
            }                
            Runner r1 = new Runner("One");
            Runner r2 = new Runner("Two");
            Thread one = new Thread(r1);
            Thread two = new Thread(r2);
            one.start();
            two.start();
            one.join();
            two.join();
            System.out.printf("One: %s, Two: %s\n", r1.time(), r2.time());
            System.out.printf("%s wins\n", r1.time() < r2.time() ? "one" : "two");
        }
    }
    
于 2013-10-22T20:40:01.683 回答
0

我不知道完整的上下文,但是Function在实用程序类中定义的闭包(即 Guava 的实现)和实现可能就是一个例子。

但是,搜索了一段时间,并没有在 Guava 本身中找到匿名闭包的例子。

于 2013-10-22T20:37:49.207 回答