JAVA本地课程有什么理由不让它成为最终课程吗?

JAVA本地课程有什么理由不让它成为最终课程吗?,java,local-class,Java,Local Class,我有一个关于Java中的局部类的问题(在方法中声明的类或在{}限定的块中声明的类) 是否有任何理由不将本地类声明为final?我们不能从本地类继承其他类(如果它不是在同一作用域中定义的),但当我们将它声明为final时,也许编译器可以使代码更简单 谢谢大家! 在任何情况下都没有理由不声明final,除非您明确地以继承为目标 我想不这样做的原因主要是疏忽,因为在大多数情况下没有明显的实际后果。一些代码分析工具,如警告您字段是否可以声明为final 关于final关键字的普遍使用问题,答案可能很好除

我有一个关于Java中的局部类的问题(在方法中声明的类或在{}限定的块中声明的类)

是否有任何理由不将本地类声明为final?我们不能从本地类继承其他类(如果它不是在同一作用域中定义的),但当我们将它声明为final时,也许编译器可以使代码更简单


谢谢大家!

在任何情况下都没有理由不声明final,除非您明确地以继承为目标

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


关于
final
关键字的普遍使用问题,答案可能很好

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

因此,添加单词不会以任何方式改变行为,但会使代码变得混乱。有人可能会想,“为什么这个类是最终的,我错过了什么新奇的东西吗?”

“在方法中声明的类”是匿名类,而“在{}包围的块中声明的类”是内部类

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


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

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

public void m() {
   class MyClass{}
   MyClass cl = new MyClass();
}
您可以声明
MyClass
final,但实际上可以从中继承,因此Java中的任何其他地方都可以将其声明为final以避免这种情况:

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

据我所知,匿名课程不被视为最终课程。但是,从语法上讲,无法从它们继承,因此需要一个强大的类文件hack来实现。

您所说的“在方法中声明的类或在{}限定的块中声明的类”是什么意思?你说的是内部类还是新的实例声明?请举例说明你的意思。(欢迎来到StackO!)如果“我们不能从本地类继承其他类”,那么宣布它为最终类的原因/优势是什么?@Guillaume他说的是本地类。就嵌套类而言,有静态嵌套类、非静态嵌套类(称为“内部类”)、本地类和匿名类。本地类是在方法体或代码块中定义的,并且只能在该范围内使用。好的,现在知道了-我以前从未使用过本地类:)否。您可以在方法中声明非匿名类。它被称为本地类。很少使用,但它存在。术语“内部类”只能用于非静态嵌套类。-1请参阅Mathias Schwarz的回复,以获取局部内部类的示例,这里:局部类可以被子类化。参见Mathias Schwarz的答案。是的,但只在同一块中。好吧,是的,因为你不能在定义它们的块之外对它们做任何事情。是的,但是这样的类的每个实现都可以在没有继承的情况下没有任何问题。我的意思是,如果你的方法包含一个大的层次结构,那么这可能是设计中的一个问题?如果层次结构不太大,就不需要继承。