7

我有一个关于Java中的本地类的问题(在方法中声明的类或由 { } 限制的块中的类)。

有什么理由不将本地类声明为final吗?我们不能从本地类继承其他类(如果它没有在同一范围内定义),但是当我们将其声明为final时,也许编译器可以使代码更简单?

谢谢!

4

4 回答 4

6

人们似乎对匿名类和本地类有点困惑。这是一个本地类:

public void m() {
   class MyClass{}
   MyClass cl = new MyClass();
}

可以声明MyClassfinal,但实际上可以从它继承,因此 Java 中的其他任何地方都可以将其声明为 final 以避免这种情况:

public void m() {
   class MyClass{}
   MyClass cl = new MyClass();
   class MyOtherClass extends MyClass{}
   MyOtherClass cl2 = new MyOtherClass();
}

据我所知,匿名类不被认为是最终的。但是,从语法上讲,没有办法从它们继承,因此需要一个强大的类文件 hack 才能这样做。

于 2011-11-15T14:08:57.557 回答
1

在任何情况下都没有理由不声明final,除非您明确地针对继承。

我想不这样做的原因主要是疏忽,因为在大多数情况下没有明显的实际后果。某些代码分析工具(例如FindBugs)会警告您是否可以将字段声明为最终字段。

可以在此处找到有关关键字的普遍使用的问题,并final提供很好的答案

于 2011-11-15T13:43:42.923 回答
0

没有理由不这样做,除非它是您的代码中不需要的关键字。IE。没有理由不这样做,也没有理由这样做。如果类在方法中声明,则不能从任何其他地方访问它,因此不能被子类化。那么,为什么要阻止无法完成的事情呢?

所以添加这个词不会以任何方式改变行为,但会弄乱你的代码。有人可能会想“为什么这门课是决赛,我是不是漏掉了什么花哨的东西?”

于 2011-11-15T13:50:46.703 回答
-2

“在方法中声明的类”是匿名类,“在以 {} 为界的块中声明的类”是内部类

匿名类不能被声明为,final因为没有办法继承它。

内部类可以是final,除非它有任何子类。

于 2011-11-15T13:56:38.603 回答