在 Go 中,可以在空指针上调用方法,只要该指针永远不会被取消引用:type empty struct{}func (e *empty) Allocated() bool { return e != nil }(对于可运行的代码,请单击此处)然而,在 Java 中,在空指针上调用方法,即使该方法从不取消对任何成员变量的引用,仍然会导致空指针异常:class Test { public boolean Allocated() { return this != null; }}有人知道为什么存在这种行为吗?它有什么好处吗?想法?
3 回答
人到中年有点甜
TA贡献1895条经验 获得超7个赞
这是因为所有 Java 方法都是虚拟的。
编写时someInstance.Allocated()
,运行时需要检查是否someInstance
实际上是覆盖该方法的派生类型。
从理论上讲,此限制本可以针对final
或private
方法放宽。
我假设语言设计者选择不这样做是为了一致性。(因此删除final
不会是一个重大变化)
MM们
TA贡献1886条经验 获得超2个赞
我认为这是一个哲学问题;方法(静态方法除外)就其本质而言适用于对象,并且在这种范式中调用像“null”这样的非对象上的方法是没有意义的。如果您想定义一个可以应用于对象或“null”的方法,那么定义一个静态方法就足够容易了,而且在我看来,这将使调用该方法的代码不会让读者感到困惑。
- 3 回答
- 0 关注
- 269 浏览
添加回答
举报
0/150
提交
取消