我对 Java 中的本地类有疑问(在方法中声明的类或以{}为界的块。)
有没有理由不将本地课程声明为最终?我们不能从本地类继承其他类(如果它没有在同一范围内定义),但是当我们将它声明为 final 时,编译器是否可以使代码更简单?
谢谢!
答案 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
,除非它有任何子类。