我正在阅读“ Head First Java ”一书,在某些时候它提到内部类实例必须绑定到外部类实例,我已经知道了,但有一个例外:
一种非常特殊的情况——<strong>在静态方法中定义的内部类。但是您可能在整个 Java 生活中都没有遇到过其中任何一种。
我很确定最后一条语句确实是正确的,但是如果编译器允许它发生,则意味着它的存在是有原因的,否则它将是非法的 Java。有人可以向我展示一个有用的例子吗?
我正在阅读“ Head First Java ”一书,在某些时候它提到内部类实例必须绑定到外部类实例,我已经知道了,但有一个例外:
一种非常特殊的情况——<strong>在静态方法中定义的内部类。但是您可能在整个 Java 生活中都没有遇到过其中任何一种。
我很确定最后一条语句确实是正确的,但是如果编译器允许它发生,则意味着它的存在是有原因的,否则它将是非法的 Java。有人可以向我展示一个有用的例子吗?
它可能很特别,也可能不是。
您正在查看方法中可用的本地类:
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!");
}
}
}
有些人认为任何可以是静态的方法都应该是静态的。对于这样的人来说,班级的内在美不会有太大的意义。
这是静态方法中内部类的虚构示例。可以说
它应该是一个命名类(即不是匿名的),因为它被多次使用
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");
}
}
我不知道完整的上下文,但是Function
在实用程序类中定义的闭包(即 Guava 的实现)和实现可能就是一个例子。
但是,搜索了一段时间,并没有在 Guava 本身中找到匿名闭包的例子。