推理方法的最终结果

时间:2011-04-18 21:10:04

标签: java methods final

很抱歉,这里有一个简单的问题,只是在我的笔记中找到了一些关于最终制作方法的内容。我的笔记声称你应该为这个方法做出决定:

  

无法强制执行不变量。

     

String应该表现为String。

我真的不明白这是什么意思。有人可以帮我分手吗?非常感谢。

8 个答案:

答案 0 :(得分:7)

我猜应该说“可以强制执行不变量”。基本上,如果有人可以覆盖一个方法,那么他们可以改变影响你的类不变量的行为。

答案 1 :(得分:3)

通常有两个理由使方法最终,性能和设计。当方法是最终的时,它可以是内联的。在HotSpot编译之前(JDK 1.1.x),这些方法通常在编译时内联,而使用HotSpot时,它们在运行时内联,除非编译器可以保证内联方法将始终与使用它的代码一起编译。 我知道创建局部变量或参数最终的原因有两个。第一个原因是您不希望代码更改局部变量或参数。许多人认为改变方法内部的参数是不好的风格,因为它使代码不清楚。作为一种习惯,一些程序员将所有参数设置为“最终”以防止他们自己更改它们。我不这样做,因为我发现它使我的方法签名有点难看。

当我们想要从内部类中访问局部变量或参数时,第二个原因就出现了。据我所知,这是实际的原因,最终的局部变量和参数被引入到JDK 1.1中的Java语言中。 Source

答案 2 :(得分:1)

是的,基本上做任何最终意味着你无法改变它。通过相同的推理,可以在类中使方法最终成为其他子类无法覆盖此方法的功能。这适用于您绝对希望这一功能始终执行此操作的情况。

答案 3 :(得分:1)

如果他们阅读了您的笔记可能会更有意义:

  

最终方法使可能强制执行不变量。

换句话说,最终确定方法可以确保它返回您所指的值,而不是返回其他人错误认为它应该被覆盖的值。

答案 4 :(得分:0)

那些笔记没有多大意义 - 我认为不可能应该'可能'。我们的想法是,如果您不希望子类更改方法的行为,则可以将该方法标记为final,并且无法覆盖该方法。这样可以比将整个类标记为最终类更精细控制。

答案 5 :(得分:0)

基本上,如果你创建一个方法final,那么你不能在子类中覆盖该方法。

如果您的应用程序的行为依赖于以某种方式表现完全的特定方法,并且您不希望其他开发人员出现并改​​变此行为,那么您可以使用'final 'keyword。

答案 6 :(得分:0)

String在创建时无法修改。这意味着它的所有内部字段都被声明为final,并且它没有提供更新其内部内容的方法。因此,当您将字符串声明为“我是字符串”时,您知道您声明的字符串将保留该值直到时间结束。

当您不希望该方法被扩展您的方法的类重写时,应该将方法声明为final。如果任何这些方法改变了类中的变量,那么只有最终方法的类仍然是可变的。

我喜欢使用不可修改的类,它确实帮助我随时了解我的程序状态,并以某种方式防止难以捕获的错误。

答案 7 :(得分:0)

    class A{
        public A(){
            print("A");
        }

        public void print(String t){
            System.out.println(t);
        }
    }

    class B extends A{
        public B(){
            super();
        }

        @Override
        public void print(String t){
            System.out.println("Not A: " + t);
        }
    }

    new B();

打印“不是A:A”

如果超类方法“print(”是最终的,那么这种类型的bug就不会发生。

通过最终,您可以强制执行此方法保持不变,以便A可以随时打印“A”