equals对象类的方法-如何工作-Java

equals对象类的方法-如何工作-Java,java,object,equals,Java,Object,Equals,我想知道对象类中的equals方法是如何工作的。这是该方法的实现 public boolean equals(Object obj) { return (this == obj); } 显然,equals方法使用的是==。 所以,现在当我比较两个对象a和b时,如果a恰好为null,它不会抛出任何异常。但是a.equals(b),抛出NPE,为什么?当您在null对象上调用方法时,它甚至不调用该方法,但在相同的移动上给出null指针错误。 这同样适用于平等者 当调用a时,等于(b) 当您

我想知道对象类中的equals方法是如何工作的。这是该方法的实现

public boolean equals(Object obj) {
    return (this == obj);
}
显然,equals方法使用的是
==

所以,现在当我比较两个对象a和b时,如果a恰好为null,它不会抛出任何异常。但是
a.equals(b)
,抛出NPE,为什么?

当您在null对象上调用方法时,它甚至不调用该方法,但在相同的移动上给出null指针错误。 这同样适用于平等者

当调用
a时,等于(b)

当您在一个为null的对象上调用equals时,它将给出null指针异常

例如,如果创建方法blank

public Class MyClass{
    public voidblank() {

    }
}
现在,即使您在null对象上调用blank,它也会给您null指针,与方法实现无关

MyClass a = null;
a.blank();
这也会将null指针作为is null

但是a等于(b),为什么会抛出NPE

因为不能在
null
上调用方法(方法由Java中的reference变量调用)。当
a
为空时,就没有什么东西可以调用
equals
打开(或取消引用)。
Object
(非原语)Java变量类型所能保存的只是引用的值(或
null
,根据定义,它不是值)。这就是Java(passbyvalue)具有按引用传递功能的原因。
Object
(s)的值是引用。

a.equals(b)抛出空指针异常,因为a为空,所以当您尝试调用空对象上的实例方法时,它会给出空指针异常。有关更多信息,请参阅以下文档了解空指针异常。

对于这些类型的情况,您应该首先检查a是否为null,然后在此对象上使用该方法

if(a != null) {
    a.equals(b);
}

因为。Null没有方法。是,无法调用Null。我了解托德。但是,我不理解最后一行,你说java具有通过引用传递的功能。我知道Java是按值传递的,但是您能解释一下最后一行吗。@user2296988当您在方法之间传递实例时,它的“状态”可以修改(因为它是按值传递的,但值是引用)。例如数组是
对象
,它对传入的数组进行排序(并返回
void
)<代码>StringBuilder允许链接的方法,返回
this
来执行此操作。嗯。。。我明白了您在这些示例中的意思,即修改方法中传递的引用值,而不需要返回。顺便问一下,在其他OOP语言中也是这样吗?null在其他语言中也不是值吗?@user2296988修改referent值时,引用值不会更改(您不能修改调用方的引用)。无论如何,在大多数语言中,我并不知道所有的语言。Erlang、Haskell、Smalltalk、LISP或Scheme可能具有不同的语义。Java确实有。我的意思是,当我们调用
Collections.sort(List)
时,该方法没有返回值。它修改“列表”(引用变量)所引用的值。调用者值在此处更改,引用也在更改。