这里我有几个问题:
1)我试图从方法中返回null
值,类似于此(仅当TypeCasted
进入对象时):
public static Object returns()
{
return (Object)null ;
}
并存储了对象:
...main()..{
Object obj= returns();
...}
当我检查时:
if( obj.equals(obj))
扔了NullPointerException
但是,
if(null==null)
System.out.println("works");
编译并给出了正确的输出。这有什么理由吗?
2)另外,当我尝试时:
public static Object returns()
{
return (Object)void ;
}
给我Syntax Error
。有什么理由吗?
3)C/C++
或其他任何OO
语言中的这种行为会有所不同吗?
答案 0 :(得分:2)
您无法在equals
上致电null
,而应使用==
。请注意,调用==
和equals
并不相同。 ==
比较引用,而equals
是按惯例比较值的方法。由于null对象没有值,因此没有任何意义。
Void不是任何语言的值,因此无法将其转换为任何内容(在本例中为Object
)。
在C ++中返回NULL,你必须返回一个指针。要比较返回的对象,您必须键入以下内容:
if( *obj == *obj)
再次这将失败,因为obj为NULL。在我知道的任何语言中,你必须在比较之前对null进行显式检查。
编辑:想一想你尝试过的ruby
答案 1 :(得分:1)
1)
if(obj.equals(obj))
默认的equals
实现只是使用==
来检查两个对象(实际上是两个引用)是否实际上是指内存中的同一个对象,但它仍然是一个调用一个实例方法,如果通过NullPointerException
调用,则绑定失败null
。
if(null==null)
反而没有给出任何问题,因为你没有调用任何实例方法,你只是在比较地址。
2)void
只是用于标记函数的关键字 1 ;尝试归还它没有任何意义。相反,null
将对象引用标记为什么都没有,这是一个完全不同的概念。
3)在C ++中没有默认的“equals”方法,整个对象模型基于值类型(在Java中,您通常使用对象的引用),因此很难做一个精确的比较。 2
在C ++中,一个对象(或引用)保证是一个“有效”对象(=为它分配了空间并且构造函数已经运行),因此不可能得到一个假设在对象上调用实例方法时等效于NullPointerException
。
另一方面,完全可以使用{em>指针 NULL
,在这种情况下,如果你尝试取消引用它,你会进入未定义的行为(通常是崩溃)以某种方式(例如通过*
或->
) 3 。
对于等式检查:默认情况下没有实现对象的==
运算符,因此只有当类的实现者实际为operator==
写了一个重载时才比较对象的相等性。对于指针,==
运算符由语言本身提供(并且不能被覆盖),它实际上比较了这两个地址。
void
被认为是一种类型(特别是“一种无法完成的不完整类型”),在Java it's not中,虽然在某些方面它可以是被视为这样。struct
并访问其字段。virtual
并且不使用对象的任何字段(= this
指针没有以任何方式解除引用),在大多数实现中你可以在NULL
指针上调用实例方法。此外,通过“正式解除引用”指针,您可以创建一个“空引用”,这可能会在使用时引起麻烦。但在这两种情况下,它仍然是未定义的行为 - 即它不正确,尽管通常不执行预防性检查,有利于执行严格的规则执行。答案 2 :(得分:0)
(Object)null
为null,这意味着您不能使用任何方法,因为它不存在。
至于语法错误,在Java void
中是一个类型,而不是一个值,因此您无法返回void
。