-1

在这里我有几个问题:

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语言中会有所不同吗?

4

3 回答 3

2

您不能调用equalsonnull而应该使用==. 注意调用==equals不一样。==比较引用 whileequals是一种按照惯例比较的方法。由于 null 对象没有值,因此对它没有任何意义。

Void 不是任何语言的值,因此不能转换为任何东西(在这种情况下Object)。

在 C++ 中要返回 NULL,您必须返回一个指针。要比较返回的对象,您必须键入以下内容:

 if( *obj == *obj)

由于 obj 为 NULL,这将再次失败。在我知道的任何语言中,您都必须在比较之前对 null 进行显式检查。

编辑:想想你尝试的东西会起作用ruby

于 2013-01-22T14:51:29.613 回答
1

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==;编写了重载时,比较对象的相等性才有意义。至于指针,==运算符由语言本身提供(不能被覆盖),它实际上比较两个地址。


  1. 与 C 和 C++ 相比, wherevoid被认为是一种类型(特别是“无法完成的不完整类型”),在 Java 中它不是,尽管在某些方面它可以被认为是这样的。
  2. 在 C 中没有类或方法时期——它不是 OO 语言;尽管如此,接下来的大部分讨论都适用于structs 和访问它们的字段。
  3. 虽然......如果实例方法不是virtual并且不使用对象的任何字段(=this指针没有以任何方式取消引用),在大多数实现中,您可能会在NULL指针上调用实例方法。此外,通过“正式取消引用”指针,您可以避免创建“空引用”,这可能会在使用时造成麻烦。但是在这两种情况下,它仍然是未定义的行为 - 即,它不正确,尽管通常不执行预防性检查,有利于性能而不是严格的规则执行。
于 2013-01-22T14:53:18.610 回答
0

(Object)null为 null,这意味着您不能在其上使用任何方法,因为它不存在。

至于语法错误,在Javavoid中是一个类型,而不是一个值,所以你不能返回void

于 2013-01-22T14:55:04.187 回答