为什么在类构造函数上调用的方法应该是最终的?

盼盼

我是Java新手,我试图从Oracle网站上的教程中理解以下内容:http : //docs.oracle.com/javase/tutorial/java/IandI/final.html

从构造函数调用的方法通常应声明为final。如果构造函数调用非最终方法,则子类可能会重新定义该方法,从而产生令人惊讶或不期望的结果。

我尝试多次阅读它,以弄清子类如何重新定义从构造函数调用的方法。我是否应该假设构造函数正在调用的方法是在构造函数的类中声明的方法?如果在构造函数中调用方法,为什么还要将其声明为final?(与从嵌套类或其他方法中来?)。一个例子会很好。

亚诺斯

这是有效的代码(编译):

class Person {
    Person() {
        init();
    }

    void init() {
        // do stuff
    }
}

class Employee extends Person {
    Employee() {
        super();
    }

    void init() {
        // do something else
    }
}

这是高度可疑的。因为这Person.init可能对类的完整性起着至关重要的作用,并且也不能保证这样Employee.init做。

限制Person.initprivate不够好。Employee.init仍然有效,但是会产生阴影 Person.init,这将非常容易引起误解。最好制造Person.init final,禁止制造Employee.init

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么字段在不变类中应该是最终的?

构造函数调用的方法应该是静态的吗?

它是强制性的实用程序类,应该是最终的私有构造函数吗?

为什么调用主函数应该是未定义的行为(UB)

为什么Applicative应该是Monad的超类?

为什么主要方法应该是静态的

为什么数据字段应该是静态的和最终的

为什么constexpr应该是静态的?

dummy()函数-应该是什么?

sonarqube Java规则不扩展类应该是最终的

为什么要在Observable函数上调用.call()?

为什么 lambda 表达式中使用的变量应该是最终的或有效的最终

为什么在其他方法上调用的类方法应该用“self”调用?

删除的默认构造函数应该是Public还是Private?

为什么在ViewHolder模式中ViewHolder类应该是静态的?

为什么函数在它应该是“n/a”时返回 undefined?

为什么在构造函数之前调用类的成员方法

PIMPL 类的 setter 应该是 const 成员函数吗?

为什么HTTP PUT方法应该是幂等,而不是POST实施RESTful服务?

为什么varargs应该是方法签名中的最后一个?

为什么Factory模式中的getInstance()方法应该是静态的?

这些类之间的关系应该是什么?

这个错误是什么意思?Render 方法应该是 props 和 state 的纯函数

在getattr()函数上调用方法

为什么Java ThreadLocal变量应该是静态的

为什么case语句中的标签应该是恒定的?

为什么内核大小应该是奇数?

为什么ssh-agent运行?应该是吗?

为什么构造函数总是在堆栈上调用?