`

override java中Object的equlas方法究竟是instanceof 还是 obj.getClass?

 
阅读更多
首先要澄清的一点是equals完全是根据自己类的逻辑的要求来设定,完全没有对错之分,但是有一点必须要指出,你认为的equals真的是按照你的设想那样工作的吗?

有的时候可能你的equals和你设想的不一样...本文的topic就是这个了。

首先看java.lang.Object中实现了equals方法
 public boolean equals(Object obj) {
	return (this == obj);
 }

就是说如果您的类没有override equals方法,那么就会调用到这个由Oject(所有类的父类)的equals方法,注意下它是怎么做的,只有在obj 和 this 的object reference指向同一个Object的时候才返回true。

好了 ,那么在我们自己实现equals方法的时候常常会用到,instanceof 和 obj.getClass(),下面代码来说明它们之间的区别。
class A{
	int a = 0;
	A(int a){
		this.a = a;
	}
	public boolean equals(Object o){
		if(o instanceof A){
			A o1 = (A)o;
			return a == o1.a;
		}
		return false;
	}
}

class B extends A{
	int a = 0;
	B(int a1, int a2){
		super(a1);
		a = a2;
	}
}

class Go{
	public static void main(String args[]){
		A a = new A(0);
		B b = new B(0, 1);
		System.out.println(a.equals(b));//true!!!!
	}
}

大家看到了吗,打印的结果是true,因为o instanceof A这个测试是通过的,b可以向上upcast,所以就出现了一个父类的对象可以和一个子类的对象“相等”,当然这个也没什么对错的,有些应用可能就需要这个逻辑,但是我想提个问,如果这种情况不该相等该怎么做呢,答案如下:
package learn;

class A{
	int a = 0;
	A(int a){
		this.a = a;
	}
	public boolean equals(Object o){
		if(o.getClass() == A.class && this.getClass() == A.class){
			A o1 = (A)o;
			return a == o1.a;
		}
		return false;
	}
}

class B extends A{
	int a = 0;
	B(int a1, int a2){
		super(a1);
		a = a2;
	}
}

class Go{
	public static void main(String args[]){
		A a = new A(0);
		B b = new B(0, 1);
		System.out.println(a.equals(b));//false!!!
	}
}
分享到:
评论

相关推荐

    Java软件开发实战 Java基础与案例开发详解 6-2 object类 共7页.pdf

    ### Java软件开发实战:Java基础与案例开发详解 #### 6-2 Object类 在Java编程语言中,`Object`类扮演着极其重要的角色。...这些方法是Java编程中不可或缺的一部分,熟练掌握它们对于编写高质量的应用程序至关重要。

    day01【Object类、常用API】-笔记.md

    这意味着所有Java类都自动继承了`Object`类中的方法和属性。 #### 关键方法 - `public String toString()`: 返回该对象的字符串表示。默认情况下,此方法返回的是对象的类名和哈希码的十六进制表示。然而,在实际...

    重写equals方法

    在 Java 中,equals 方法是一个非常重要的方法,它用于判断两个对象是否相等,而不是判断两个对象的引用是否相同。在 Object 基类中,equals 方法的实现是使用“==”操作符来比较对象的引用,但是这并不满足实际需求...

    java-object类

    2. **提供通用方法**:`Object` 类定义了一些非常重要的方法,如 `equals()`、`hashCode()` 和 `toString()`,这些方法在几乎所有 Java 类中都有应用。 3. **支持多态性**:通过继承 `Object` 类,Java 支持多态性,...

    api_object.zip_API_java_lipsziy

    在Java编程语言中,`Object` 类是所有类的根,包括我们自定义的类。当我们创建一个新的类时,除非明确地指定其他父类,否则该类默认继承自 `Object` 类。`api_object.zip_API_java_lipsziy` 这个压缩包包含了对 `...

    Java中equals方法隐藏的陷阱

    `equals`方法的标准定义是在`java.lang.Object`类中,其签名是`public boolean equals(Object obj)`。这是一个重要的设计决策,因为这样可以确保任何对象都可以被传递给`equals`方法进行比较。然而,在实际开发过程...

    java基础——方法的重写、多态+instanceof(csdn)————程序.pdf

    在Java编程语言中,方法的重写和多态是面向对象设计的重要概念,它们使得代码更加灵活和可扩展。下面将详细阐述这两个概念及其应用场景。 首先,方法的重写(Override)是指在一个子类中定义与父类相同名称和参数...

    java反射.pdf

    2. **使用实例对象**:对于已有实例的对象,可以调用其`getClass()`方法,如`obj.getClass()`。 3. **使用字符串类名**:通过`Class.forName("包名.类名")`加载类。 #### 三、通过反射创建对象 反射提供了动态创建...

    java对象转换String类型的三种方法共1页.pdf

    Java中的每个对象都继承自`Object`类,因此所有对象都默认拥有`toString()`方法。这个方法返回一个表示该对象的字符串,通常包括类名、哈希码等信息。如果你需要自定义对象的字符串表示,你应该重写`toString()`...

    Java -核心类库 Object类常方法 Math类常用方法 System类常用方法 基本类型包装类常用方法等

    因此了解并掌握`Object`类的方法对于深入理解Java编程至关重要。 1. **toString() 方法**: - **用途**:提供了一个方便的方式来打印或展示对象的信息。 - **默认行为**:返回对象的内存地址。 - **重写示例**:...

    java常用设计模式及JDK与CGLIB实现动态代理区别(源码)

    public Object intercept(Object obj, Method method, Object[] objs, MethodProxy proxy) throws Throwable { System.out.println("事物开始.........."); proxy.invokeSuper(obj, objs); System.out....

    Java动态代理两种实现方式

    Java动态代理技术是Java编程中一个非常重要的特性,它允许我们在运行时动态创建具有特定行为的对象。这种技术常用于AOP(面向切面编程)和框架中,如Spring AOP,用于实现方法拦截、事务管理等功能。Java提供了两种...

    Object类和Scanner类

    ### Object类和Scanner类 #### 一、Object类详解 ...通过以上介绍可以看出,`Object` 类和 `Scanner` 类分别代表了Java中对象的基本行为和简单的输入处理功能,它们都是Java编程不可或缺的一部分。

    Java equals 方法与hashcode 方法的深入解析.rar

    首先,`equals()`方法是Java Object类中的一个方法,它的默认行为是基于对象的引用进行比较,即如果两个对象引用指向同一个内存地址,那么`equals()`返回`true`,否则返回`false`。然而,当我们在自定义类中重写`...

    java中动态代理,springAop.pdf

    Java中的动态代理是一种强大的设计模式,它允许在运行时创建具有相同接口但具有额外功能的对象。这个额外的功能通常包括日志、性能监控、事务管理等。Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它...

    java练习题库

    - **Object类**: 是所有Java类的根类,它位于`java.lang`包中,提供了许多基本的方法,这些方法可以被其他任何类继承并使用。 - **finalize方法**: 在对象即将被垃圾回收器回收之前调用。此方法主要用于执行清理...

    动态代理的思维导图(自用)

    在Java中,动态代理主要分为两种类型:JDK动态代理和CGLib动态代理。 **JDK动态代理** JDK动态代理基于Java的接口实现。它要求目标对象必须实现至少一个接口。代理对象是通过`java.lang.reflect.Proxy`类的`...

    Java中的动态代理

    ### Java中的动态代理知识点解析 #### 一、动态代理概念 在Java中,动态代理是一种设计模式,它允许我们创建一个对象来代表另一个对象。这种模式通常用于在不修改目标对象的情况下,为对象添加额外的功能或者行为...

    不懂RPC,休谈微服务

    public static Object getProxy(Object obj) { return java.lang.reflect.Proxy.newProxyInstance( obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new RPCProxyClient(obj) ); } /** ...

Global site tag (gtag.js) - Google Analytics