假设我有以下基类:
class Base {
public:
virtual void f() {};
};
如果我想编写一个类,它将覆盖< code>f()并且不允许覆盖它的派生类,可以使用以下方法编写它:
方法一:
class Derived : public Base {
public:
virtual void f() override final {};
};
方法2:
class Derived : public Base {
public:
void f() final {};
};
< code >方法1非常详细,而< code >方法2更加紧凑,并且< code>final仍然表示< code>f()实际上是虚拟的,并且覆盖了基类方法。
哪一种方法更合适?
这是非常过时的,因为C11已经广泛可用,但作为C11的早期采用者,我使用#defines来覆盖和最终将我的代码移植到C03和更早版本。
我怀疑这在任何现代平台上都是必须的,但你永远不会知道。
我仍然发现覆盖和虚拟关键字不在同一侧,这在美学上是令人痛苦的。
这个问答比现在的更好参考。
class Derived : public Base {
public:
void f() override final {};
};
也许那样<在派生类中不需要code>virtual关键字,如果没有要重写的方法,override
和final
都会给您一个编译器错误,但您或其他人可能希望在将来删除finaloverride
在“方法1”中,虚拟确实是多余的。“覆盖”是一个特殊的标识符,它向代码的阅读器显示一个虚函数正在被覆盖,同时也是编译器验证它是否真的是的提示。基类已经声明该函数是虚的,所以没有必要再这样做了。
当不使用“final”关键字时,最好使用“virtual”,以保持可读性。在这种情况下,方法2是最佳实践符号。
这可以归结为你的环境中使用的风格,但是final并不意味着覆盖final。
问题内容: 我来自C ++,所以我不太了解Java的一项功能。我已经读过,除原始元素外,所有对象都必须使用关键字创建。现在,如果编译器可以识别原始类型,并且不允许您创建一个不带构造函数的对象,那么为什么根本没有关键字呢?有人可以提供一个示例,说明两行代码,除了存在的,相同,编译且具有不同的含义/结果之外,相同吗? 只是为了澄清我的意思是多余,并希望使我的问题更清楚。是否添加任何东西?语言是否可以通
问题内容: 如果我在一个类中有以下声明,其中是抽象类型: 是否能让我仍然能够更改中的对象的状态,但阻止我将新对象添加到列表中?如果我写错了,请您解释一下正在做什么以及何时应该使用关键字。 问题答案: 不,final关键字不会使列表或其内容不可变。如果您想要一个不可变的列表,则应使用: final关键字的作用是防止您为’synapses’变量分配新值。即,您不能写: 但是,您可以编写:
所以我在编译上面的代码时出现了明显的错误,但是错误是访问修饰符的非法组合,但是java文档http://docs.oracle.com/javase/tutorial/java/javao/accesscontrol.html说只有三个访问修饰符(public,private和protected),所以这些抽象的、最终的、public,private和protected是访问修饰符或访问说明符还是
一段时间以来,我一直想知道,在最佳实践中,是否可以避免在< code>java.util.Map上使用< code>containsKey()方法,而是对< code>get()的结果进行空检查。 我的理由是,对值进行两次查找似乎是多余的——第一次是对< code>containsKey()进行查找,然后再次对< code>get()进行查找。 另一方面,可能是大多数的标准实现缓存了最后的查找,或
问题内容: 在某些示例BlackBerry Java类中,我已经看到以下代码: 我认为这是为了表现。按照标题,由于几乎没有(曾经?)有任何理由修改已经抛出的,它们应该总是吗? 如果是这样,编译器是否可以完成此操作?还是由编译器完成,手动添加完全没有影响? 问题答案: Java语言规范11.2.2在最终异常与非最终异常之间进行了区别: 如果throw语句(第14.18节)的抛出表达式具有静态类型E,
本文向大家介绍请说明”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?相关面试题,主要包含被问及请说明”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?时的应答技巧和注意事项,需要的朋友参考一下 考察点:static变量 “static”关键字表明一个成员变量