1)
if(obj.equals(obj))
确实,默认equals
实现只是用于==
检查两个对象(实际上是两个引用)是否实际上引用了内存中的同一个对象,但它仍然是对实例方法的调用,NullPointerException
如果它是必然会失败叫过来一个null
。
if(null==null)
相反没有任何问题,因为你没有调用任何实例方法,你只是在比较地址。
2)void
只是一个关键字,用于标记不返回任何内容的函数1;尝试退货没有任何意义。null
,相反,将对象引用标记为不指向任何内容,这是一个完全不同的概念。
3) 在 C++ 中没有默认的“equals”方法,并且整个对象模型都是基于值类型的(在 Java 中,您通常使用对对象的引用),因此很难进行精确的比较。2
在 C++ 中,对象(或引用)被保证是“有效”对象(=为其分配了空间并且构造函数已运行),因此不可能NullPointerException
在对象上调用实例方法时获得假设的等价物.
另一方面,完全有可能有一个指针,NULL
在这种情况下,如果您尝试以某种方式(例如通过*
或->
)取消引用它,您将进入未定义的行为(通常是崩溃)3。
至于相等性检查:==
对象的运算符默认情况下没有实现,因此只有当类的实现者实际上为operator==
;编写了重载时,比较对象的相等性才有意义。至于指针,==
运算符由语言本身提供(不能被覆盖),它实际上比较两个地址。
- 与 C 和 C++ 相比, where
void
被认为是一种类型(特别是“无法完成的不完整类型”),在 Java 中它不是,尽管在某些方面它可以被认为是这样的。
- 在 C 中没有类或方法时期——它不是 OO 语言;尽管如此,接下来的大部分讨论都适用于
struct
s 和访问它们的字段。
- 虽然......如果实例方法不是
virtual
并且不使用对象的任何字段(=this
指针没有以任何方式取消引用),在大多数实现中,您可能会在NULL
指针上调用实例方法。此外,通过“正式取消引用”指针,您可以避免创建“空引用”,这可能会在使用时造成麻烦。但是在这两种情况下,它仍然是未定义的行为 - 即,它不正确,尽管通常不执行预防性检查,有利于性能而不是严格的规则执行。