最终静态方法考试

时间:2012-12-11 16:57:23

标签: java static-methods

我一直在学习我的软件开发课程,并从样本中找到了问题:

“为什么在Java方法前面同时使用静态和最终修饰符是没有意义的?”

我已经进行了一些研究,无论我去哪里都说这不是一种不好的做法,并且有充分的理由这样做 - 例如,这个stackoverflow问题: Is it a bad idea to declare a final static method?

那么,这个问题本身是荒谬的还是对这个问题有合理的答案?

(此样本文件没有给出解决方案)

4 个答案:

答案 0 :(得分:8)

static方法不能被覆盖,因为它们不与类的实例相关联,而是与类本身相关联。例如,您通常会调用static方法:

  MyClass.myStaticMethod()

这就是你调用实例方法的方法:

  new MyClass().myInstanceMethod()

final修饰符与方法一起用于在扩展类中禁止它们的覆盖。

答案 1 :(得分:5)

因为无法覆盖static 方法。因此,标记final没有意义。

但是请注意static final 变量(奇怪的是,因此它们不能更改,因此它们不是变量)非常有用,因为它们的值可以由编译器内联。

答案 2 :(得分:1)

静态方法可以被重写(虽然这不是技术术语),因为它在运行时被解析,在类链中向上搜索直到找到它。但这个“特征”可能是一个错误;人们不使用它,人们不知道它,我们应该假装它不存在。

答案 3 :(得分:0)

来自Java Language Spec

  

始终在不引用特定方法的情况下调用类方法   宾语。尝试引用当前是编译时错误   使用关键字this或关键字super的对象。

因此,您无法覆盖静态方法,因为它不属于实例。因此,关键字thissuper不可用,您无法使用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方法就是所谓的。