我一直在学习我的软件开发课程,并从样本中找到了问题:
“为什么在Java方法前面同时使用静态和最终修饰符是没有意义的?”
我已经进行了一些研究,无论我去哪里都说这不是一种不好的做法,并且有充分的理由这样做 - 例如,这个stackoverflow问题: Is it a bad idea to declare a final static method?
那么,这个问题本身是荒谬的还是对这个问题有合理的答案?
(此样本文件没有给出解决方案)
答案 0 :(得分:8)
static
方法不能被覆盖,因为它们不与类的实例相关联,而是与类本身相关联。例如,您通常会调用static
方法:
MyClass.myStaticMethod()
这就是你调用实例方法的方法:
new MyClass().myInstanceMethod()
final
修饰符与方法一起用于在扩展类中禁止它们的覆盖。
答案 1 :(得分:5)
因为无法覆盖static
方法。因此,标记final
没有意义。
但是请注意static final
变量(奇怪的是,因此它们不能更改,因此它们不是变量)非常有用,因为它们的值可以由编译器内联。
答案 2 :(得分:1)
静态方法可以被重写(虽然这不是技术术语),因为它在运行时被解析,在类链中向上搜索直到找到它。但这个“特征”可能是一个错误;人们不使用它,人们不知道它,我们应该假装它不存在。
答案 3 :(得分:0)
始终在不引用特定方法的情况下调用类方法 宾语。尝试引用当前是编译时错误 使用关键字this或关键字super的对象。
因此,您无法覆盖静态方法,因为它不属于实例。因此,关键字this
和super
不可用,您无法使用virtual method invocation。如果你不能使用虚方法调用,那么final关键字是没用的。
我喜欢认为编译器会看到像这样的方法声明:
public class SomeClass{
// public static classMethod() becomes
public static [final] void classMethod(){
//...
}
// and public void instanceMethod() becomes
public void instanceMethod(SomeClass this, Object super){
//....
}
}
public class SomeOtherClass extends SomeClass{
// overrides
@Override
public void instanceMethod(SomeOtherClass this, SomeClass super){
//...
}
}
您拨打SomeClass instance = new SomeOtherClass().instanceMethod();
,然后拨打instanceMethod()
的{{1}}。
因此编译器不需要复制方法体,只需将引用传递给线程中的当前对象。因此,当您使用虚方法调用时,实际上您通过引用当前对象(SomeOtherClass
)来调用instanceMethod
,并且当前类的body方法就是所谓的。