为了账号安全,请及时绑定邮箱和手机立即绑定

在Java方法中使用类定义

在Java方法中使用类定义

慕容森 2019-10-15 15:40:14
例: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我很难以面向对象的方式来想象这个概念。在行为中具有类定义。可能有人可以通过等效的真实例子告诉我。方法中的抽象类对我来说有点疯狂。但不允许使用任何接口。这背后有什么原因吗?
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

这称为本地课程。


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

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


查看完整回答
反对 回复 2019-10-15
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

  1. 从方法外部无法看到该类(即,实例化了其方法,无需使用Reflection即可访问)。另外,它可以访问在testMethod()中定义的局部变量,但可以在类定义之前。

  2. 我实际上以为:“不会写入任何此类文件。” 直到我尝试为止:哦,是的,这样的文件已创建!它将被称为A $ 1B.class之类的东西,其中A是外部类,而B是本地类。

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


查看完整回答
反对 回复 2019-10-15
?
动漫人物

TA贡献1815条经验 获得超10个赞

当您希望满足以下条件时,唯一的情况是内部类与匿名类(又名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 );

}

不过,在使用此模式之前,请评估普通的旧顶级类,内部类或静态内部类是否是更好的选择。


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 760 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信