在Java中,我们看到很多地方可以使用final关键字,但它的使用并不常见。例如:Stringstr="abc";System.out.println(str);在上述情况下,str可以是final,但这通常被忽略。当一个方法永远不会被覆盖时,我们可以使用final关键字。类似地,对于不会被继承的类。在任何或所有这些情况下使用final关键字真的可以提高性能吗?如果是这样,那怎么办?请解释。如果正确使用final确实对性能很重要,那么Java程序员应该养成哪些习惯来充分利用关键字? 最佳答案 通常不会。对于虚拟方法,HotSpot会
我已经阅读了很多关于finalize()的菜鸟Java问题,发现没有人真正明确说明finalize()是一种不可靠的清理资源。我看到有人评论说他们用它来清理连接,这真的很可怕,因为接近保证连接已关闭的唯一方法是最终实现try(catch)。我没有受过CS教育,但我从事Java专业编程已有近十年了,而且我从未见过有人在生产系统中实现finalize()。这仍然不意味着它没有它的用途,或者我合作过的人一直在做正确的事情。所以我的问题是,在实现finalize()时有哪些用例无法通过语言中的另一个进程或语法更可靠地处理?请提供具体的场景或者你的经验,只是重复Java教科书,或者final
我不明白final关键字在用于方法参数时真正在哪里很方便。如果我们排除匿名类的使用、可读性和意图声明,那么对我来说几乎毫无值(value)。强制某些数据保持不变并不像看起来那么强大。如果参数是一个原始参数,那么它将不起作用,因为参数作为值传递给方法,并且更改它不会在范围之外产生任何影响。如果我们通过引用传递参数,那么引用本身就是一个局部变量,如果在方法内部更改了引用,则不会在方法范围之外产生任何影响。考虑下面的简单测试示例。尽管该方法更改了给它的引用的值,但该测试通过了,但没有任何效果。publicvoidtestNullify(){Collectionc=newArrayList()
在Java中,我们使用final关键字和变量来指定其值不会被更改。但是我看到您可以更改类的构造函数/方法中的值。同样,如果变量是static那么它就是一个编译错误。代码如下:importjava.util.ArrayList;importjava.util.List;classTest{privatefinalListfoo;publicTest(){foo=newArrayList();foo.add("foo");//Modification-1}publicstaticvoidmain(String[]args){Testt=newTest();t.foo.add("bar");
我想在我的C++程序中实现一个finallyblock,如果不是native工具,该语言当然有工具可以做到这一点。我想知道最好的方法是什么? 最佳答案 这个简单的实现似乎是100%安全的。templateclasssentry{to;public:sentry(tin_o):o(std::move(in_o)){}sentry(sentry&&)=delete;sentry(sentryconst&)=delete;~sentry()noexcept{static_assert(noexcept(o()),"Pleasecheckt
我想在我的C++程序中实现一个finallyblock,如果不是native工具,该语言当然有工具可以做到这一点。我想知道最好的方法是什么? 最佳答案 这个简单的实现似乎是100%安全的。templateclasssentry{to;public:sentry(tin_o):o(std::move(in_o)){}sentry(sentry&&)=delete;sentry(sentryconst&)=delete;~sentry()noexcept{static_assert(noexcept(o()),"Pleasecheckt
我正在阅读一篇很棒的awesomeC++11tutorial并且作者在解释final关键字时提供了这个例子:structB{virtualvoidf()constfinal;//donotoverridevirtualvoidg();};structD:B{voidf()const;//error:D::fattemptstooverridefinalB::fvoidg();//OK};那么在这里使用final关键字有意义吗?在我看来,您可以避免在此处使用virtual关键字并防止f()被覆盖。 最佳答案 如果不将函数标记为virt
我正在阅读一篇很棒的awesomeC++11tutorial并且作者在解释final关键字时提供了这个例子:structB{virtualvoidf()constfinal;//donotoverridevirtualvoidg();};structD:B{voidf()const;//error:D::fattemptstooverridefinalB::fvoidg();//OK};那么在这里使用final关键字有意义吗?在我看来,您可以避免在此处使用virtual关键字并防止f()被覆盖。 最佳答案 如果不将函数标记为virt
C++11将允许将类和虚方法标记为final以禁止从它们派生或覆盖它们。classDriver{virtualvoidprint()const;};classKeyboardDriver:publicDriver{voidprint(int)constfinal;};classMouseDriverfinal:publicDriver{voidprint(int)const;};classDatafinal{intvalues_;};这非常有用,因为它告诉接口(interface)的读者一些关于使用这个类/方法的意图。用户在尝试覆盖时获得诊断可能也很有用。但是从编译器的角度来看有优势吗
C++11将允许将类和虚方法标记为final以禁止从它们派生或覆盖它们。classDriver{virtualvoidprint()const;};classKeyboardDriver:publicDriver{voidprint(int)constfinal;};classMouseDriverfinal:publicDriver{voidprint(int)const;};classDatafinal{intvalues_;};这非常有用,因为它告诉接口(interface)的读者一些关于使用这个类/方法的意图。用户在尝试覆盖时获得诊断可能也很有用。但是从编译器的角度来看有优势吗