【问题标题】:final static methods exam最终静态方法考试
【发布时间】:2012-12-11 16:57:22
【问题描述】:

我一直在学习我的软件开发课程,并从一个示例中遇到了这个问题:

“为什么在 Java 方法前面同时使用 static 和 final 修饰符没有意义?”

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

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

(此示例论文没有给定的解决方案)

【问题讨论】:

  • 不是没有意义,只是多余。
  • 我有一个不同的问题要问你; “为什么公开抽象类的构造函数没有意义?” ;)
  • 我想说这个问题应该是关于 private 修饰符而不是 static :)

标签: java static-methods


【解决方案1】:

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

  MyClass.myStaticMethod()

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

  new MyClass().myInstanceMethod()

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

【讨论】:

    【解决方案2】:

    因为static 方法不能被覆盖。因此,将其标记为final 毫无意义。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        来自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()SomeOtherClass

        因此编译器不需要复制方法体,只需将引用传递给线程中的当前对象。所以,当你使用虚方法调用时,实际上你是在调用 instanceMethod 并引用当前对象(this),而调用的是当前类的主体方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-17
          • 1970-01-01
          • 2016-01-21
          • 1970-01-01
          • 2019-04-14
          相关资源
          最近更新 更多