在Java方法中使用类定义

例:


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();

    }

}

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


在方法内部拥有类定义的用途是什么?

是否会为生成一个类文件 DummyClass

我很难以面向对象的方式来想象这个概念。在行为中具有类定义。可能有人可以通过等效的真实例子告诉我。

方法中的抽象类对我来说有点疯狂。但不允许使用任何接口。这背后有什么原因吗?


慕容森
浏览 797回答 3
3回答

慕码人8056858

这称为本地课程。2很简单:是的,将生成一个类文件。1和3是同一个问题。您可以使用本地类,而无需使用一种方法来实例化一个本地类,也无需在任何地方知道实现细节。典型的用途是创建某些接口的一次性实现。例如,您经常会看到以下内容:  //within some method  taskExecutor.execute( new Runnable() {       public void run() {            classWithMethodToFire.doSomething( parameter );       }  }); 如果您需要创建一堆这些文件并对其进行处理,则可以将其更改为  //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());关于接口:我不确定是否存在使本地定义的接口成为编译器问题的技术问题,但是即使没有,它们也不会增加任何价值。如果在方法之外使用了实现本地接口的本地类,则该接口将毫无意义。如果只在方法内部使用本地类,则接口和类都将在该方法内实现,因此接口定义将是多余的。

慕码人2483693

从方法外部无法看到该类(即,实例化了其方法,无需使用Reflection即可访问)。另外,它可以访问在testMethod()中定义的局部变量,但可以在类定义之前。我实际上以为:“不会写入任何此类文件。” 直到我尝试为止:哦,是的,这样的文件已创建!它将被称为A $ 1B.class之类的东西,其中A是外部类,而B是本地类。特别是对于回调函数(GUI中的事件处理程序,例如单击Button时的onClick()等),通常使用“匿名类”-首先,因为您可以得到很多匿名类。但是有时候匿名类还不够好-特别是,您不能在它们上定义构造函数。在这些情况下,这些方法局部类可以是一个很好的选择。

动漫人物

当您希望满足以下条件时,唯一的情况是内部类与匿名类(又名Java闭包)具有完整的功能您需要提供接口或抽象类实现您想使用在调用函数中定义的一些最终参数您需要记录接口调用的执行状态。例如,有人想要一个,Runnable而您想记录执行开始和结束的时间。对于匿名类,这是不可能的,对于内部类,您可以做到这一点。这是一个例子来说明我的观点private static void testMethod (        final Object param1,        final Object param2    ){    class RunnableWithStartAndEnd extends Runnable{        Date start;        Date end;        public void run () {            start = new Date( );            try            {                evalParam1( param1 );                evalParam2( param2 );                ...            }            finally            {                end = new Date( );            }        }    }    final RunnableWithStartAndEnd runnable = new RunnableWithStartAndEnd( );    final Thread thread = new Thread( runnable );    thread.start( );    thread.join( );    System.out.println( runnable.start );    System.out.println( runnable.end );}不过,在使用此模式之前,请评估普通的旧顶级类,内部类或静态内部类是否是更好的选择。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java