在Java中的方法中使用类定义

bra*_*boy 100 java class local-class

例:

public class TestClass {

    public static void main(String[] args) {
        TestClass t = new TestClass();
    }

    private static void testMethod() {
        abstract class TestMethod {
            int a;
            int b;
            int c;

            abstract void implementMe();
        }

        class DummyClass extends TestMethod {
            void implementMe() {}
        }

        DummyClass dummy = new DummyClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现上面的代码在Java中完全合法.我有以下问题.

  1. 在方法中有一个类定义有什么用?
  2. 是否会为其生成一个类文件 DummyClass
  3. 我很难以面向对象的方式想象这个概念.在行为中包含类定义.也许有人可以告诉我相同的现实世界的例子.
  4. 方法中的抽象类对我来说听起来有点疯狂.但是不允许接口.这背后有什么理由吗?

Jac*_*son 68

这称为本地类.

2是简单的:是的,将生成一个类文件.

1和3是同一个问题.您将使用本地类,您永远不需要在一个方法中的任何地方实例化或了解实现细节.

一个典型的用途是创建一些接口的一次性实现.例如,你经常会看到这样的东西:

  //within some method
  taskExecutor.execute( new Runnable() {
       public void run() {
            classWithMethodToFire.doSomething( parameter );
       }
  }); 
Run Code Online (Sandbox Code Playgroud)

如果您需要创建一堆这些并使用它们执行某些操作,则可以将其更改为

  //within some method
  class myFirstRunnableClass implements Runnable {
       public void run() {
            classWithMethodToFire.doSomething( parameter );
       }
  }
  class mySecondRunnableClass implements Runnable {
       public void run() {
            classWithMethodToFire.doSomethingElse( parameter );
       }
  }
  taskExecutor.execute(new myFirstRunnableClass());
  taskExecutor.execute(new mySecondRunnableClass());
Run Code Online (Sandbox Code Playgroud)

关于接口:我不确定是否存在使本地定义的接口成为编译器问题的技术问题,但即使没有,也不会添加任何值.如果在方法外部使用了实现本地接口的本地类,则该接口将毫无意义.如果本地类只在该方法中使用,那么接口和类都将在该方法中实现,因此接口定义将是多余的.


Bal*_*usC 15

那些被称为本地课程.您可以在此处找到详细说明和示例.该示例返回一个特定的实现,我们不需要知道该方法之外的内容.

  • 很棒的链接(超过7年仍然有效!)。尤其要注意“像成员类一样,本地类与包含的实例相关联,并且*可以访问包含类*的任何成员,包括私有成员”。 (2认同)

Chr*_*her 9

  1. 从方法外部看不到类(即实例化,其方法在没有反射的情况下访问).此外,它可以访问testMethod()中定义的局部变量,但在类定义之前.

  2. 我实际上想:"不会写这样的文件." 直到我试过它:哦,是的,这样的文件被创建了!它将被称为A $ 1B.class,其中A是外部类,B是本地类.

  3. 特别是对于回调函数(GUI中的事件处理程序,比如单击Button时的onClick()等),通常使用"匿名类" - 首先是因为你最终会得到很多.但有时候匿名类不够好 - 尤其是你不能在它们上定义构造函数.在这些情况下,这些方法本地类可以是一个很好的选择.

  • 埃尔姆,当然可以.将为java文件中的每个嵌套,本地或匿名类生成类文件. (2认同)
  • "2.不会写这样的文件." - 这是错的.它创建了`TestClass $ 1TestMethodClass.class`,类似于内部类`.class`文件的命名方式. (2认同)

Ste*_* B. 7

这样做的真正目的是允许我们在函数调用中内联创建类来控制我们这些喜欢假装我们用函数式语言编写的人;)