在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生成一个类文件
- 我很难以面向对象的方式想象这个概念。 在行为中有一个类定义。 也许有人可以用相同的真实世界的例子告诉我。
- 抽象类中的方法听起来有点疯狂。 但是没有接口允许。 这背后有什么理由吗?
这被称为本地class。
2是简单的:是的,将生成一个类文件。
1和3是一样的问题。 你将使用一个本地类,你永远不需要实例化一个或知道实现的细节,但在一个方法。
一个典型的用法是创build一个接口的一个丢弃实现。 例如,你经常会看到类似这样的东西:
//within some method taskExecutor.execute( new Runnable() { public void run() { classWithMethodToFire.doSomething( parameter ); } });
如果你需要创build一些这些,并与他们做一些事情,你可以改变这一点
//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());
关于接口:我不确定是否有一个技术问题使得本地定义的接口成为编译器的问题,但即使没有,也不会增加任何值。 如果在方法之外使用实现本地接口的本地类,则该接口将毫无意义。 而如果一个本地类只是在方法内部使用,接口和类将在该方法内实现,所以接口定义将是多余的。
这些被称为本地类 。 你可以在这里find一个详细的解释和例子。 这个例子返回一个具体的实现,我们不需要知道关于这个方法。
-
该类不能从方法外部看到(例如,实例化,其方法访问没有reflection)。 另外,它可以访问在testMethod()中定义的局部variables,但是在类定义之前。
-
我其实是想:“不会写这样的文件。” 直到我刚刚尝试过:哦,是的,这样的文件被创build! 它将被称为像A $ 1B.class,其中A是外部类,B是本地类。
-
特别是对于callback函数(graphics用户界面中的事件处理程序,比如点击button时的onClick()等),通常会使用“匿名类” – 首先,因为最终可能会有很多类。 但有时候匿名类还不够好 – 尤其是,你不能在其上定义构造函数。 在这些情况下,这些方法本地类可以是一个很好的select。
这样做的真正目的是允许我们在函数调用中创build类内联的类来控制那些喜欢假装我们正在使用函数式语言编写的人;)
当你想有一个完整的函数内部类与匿名类(又名Javaclosures)唯一的情况是满足以下条件
- 你需要提供一个接口或抽象类的实现
- 你想使用调用函数中定义的一些最终参数
- 你需要logging接口调用的一些执行状态。
例如有人想要一个Runnable
并且你想logging执行开始和结束的时间。
与匿名类是不可能的,与内部类可以做到这一点。
这里是一个例子来certificate我的观点
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 ); }
在使用这个模式之前,请评估一下普通的旧的顶层类,内部类或静态内部类是否是更好的select。
定义内部类(在方法或类中)的主要原因是处理封闭类和方法的成员和variables的可访问性。 内部类可以查找私有数据成员并对其进行操作。 如果在一个方法中,它也可以处理最终的局部variables。
有内在的课程确实有助于确保这个课程对外界不可访问。 这尤其适用于GWT或GXT等UI编程的情况,其中JS生成代码是用java编写的,每个button或事件的行为都必须通过创build匿名类来定义
在课堂上创build对象
object ob=new object();
in方法
void method( object ob) ob= this.ob;
该对象被assisgned,这是在课堂上创build的