Java的。当地的课程是否有任何理由不让它成为最终的?

时间:2011-11-15 13:40:14

标签: java local-class

我对 Java 中的本地类有疑问(在方法中声明的类或以{}为界的块。)

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

谢谢!

4 个答案:

答案 0 :(得分:6)

人们似乎对匿名课程和本地课程感到有些困惑。这是一个本地课程:

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

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

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

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

答案 1 :(得分:1)

除非明确指出继承,否则没有理由不在任何情况下声明 final

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

有关普遍使用final关键字以及非常好的答案的问题可能会找到here

答案 2 :(得分:0)

除了代码中不需要的关键字之外,没有理由不这样做。即。没有理由不这样做,也没有理由这样做。如果在方法中声明了类,则无法从任何其他位置访问该类,因此无法进行子类化。那么为什么要防止一些无法做到的事情呢?

因此添加单词不会以任何方式改变行为,但会使代码混乱。有人可能会想“为什么这堂课最后,我错过了一些奇特的东西?”

答案 3 :(得分:-2)

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

匿名类不能声明为final,因为无法继承它。

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