这个问题讨论了非静态最终变量的实践。
我的问题(由于我很忙,我将使其变得快速)是在变量上使用final修饰符后,没有什么可以更改它,对吗?
所以可以说我在一个名为animal的类中有一个静态最终Integer,值10。
public static final int SIZE = 10;
Run Code Online (Sandbox Code Playgroud)
这意味着所有从animal类型创建的对象的SIZE = 10。
什么时候使用非静态的但最终的变量有用,实用或被接受:
public final int SIZE = 10;
Run Code Online (Sandbox Code Playgroud)
这也意味着所有从animal类型创建的对象的大小都将为SIZE = 10。
那么后者在什么情况下有用?因为它基本上意味着同一件事。
假设我们有一个Foo
包含一个方法的类,该方法可能会抛出IOException
.
public abstract class Foo {
public abstract void foo() throws IOException;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我FooImpl
像这样扩展该类时:
public class FooImpl extends Foo {
public void foo() throws Exception {
throw new Exception("This cannot throw!");
}
}
Run Code Online (Sandbox Code Playgroud)
这会导致编译时错误:“覆盖的方法不会抛出 java.lang.Exception”
我理解这是因为覆盖方法“可能只抛出其父方法的已检查异常,以及任何未检查的异常”
为什么会这样呢?为什么我们要禁止自己抛出更广泛的异常?
(我也在寻找解决方法)
谢谢!