文档章节

equals

elson1024
 elson1024
发布于 2014/04/29 23:37
字数 558
阅读 68
收藏 3
class A{
    public int i;
    public A(int i){   // 构造函数
        this.i = i;
    }    
}
public class TestEq{
    public static void main(String[] args){
        A aa1 = new A(2);
        B aa2 = new A(2);
        
        System.out.println(aa1.equlas(aa2)); //false        
    }
}

为什么是这样?

    如果我们单独

 System.out.println(aa1);   -> 前面A表示类 @后面跟着的是这个对象在内存中地址16进制的表示
 System.out.println(aa2);

很明显不是同一个对象,如果是同一个对象那么地址也可以说指针吧,肯定是一样的,不一样是因为

    在内存中我们开辟了4个内存,aa1,aa2 在栈中,分别指向了堆中一个new A(2) , 一个new A(2)

这样两个对象不相等那是理所当然的了

那以后我们可能会写一些容器之类的东西,把一些类丢进去,重复的就不要了,那我们可以

class A{
    public int i; 
    public A(int i){
        this.i = i;
    }
    public boolean equals(Object obj){
        A aa = (A)obj;
        if(aa.i == this.i)
            return true;
        else
            return false;
     }
}
public class testB{
    public static void main(String[] args){
        A aa1 = new A(2);
        A aa2 = new A(2);
        System.out.println(aa1.equals(aa2));  //true
    }
}

   那为什么重写父类的equlas的时候加上

 A aa = (A)obj //这句 就可以了?

举个简单例子

class A{     //父类
    void f(){
        System.out.printf("AAAAA\n");
    }
}
class B extends A{   子类继承父类A
    void f(){
        System.out.printf("BBBBB\n");
    }

    void g(){}
}

public class testPloy{
    public static void main(String[] args){
        A aa = new A();
        B bb = new B();  
        aa.f()//success, 因为父类可以调用子类继承自己的东西
        aa.g()//error ,因为父类无法调用子类所特有的东西
        //假如把子类bb的指针发送给父类aa呢
        aa = bb
        aa.g()//error
        //那唯有通过强制转换
        B bb2 = (B)aa;
        bb2.g() //success
        //强制转换必须有个先确条件就是 aa=bb,必须是父类已经指向了子类才行
    }
}

所以回头在看这个重写的equals

 aa1.equals(aa2);

我们把aa2发送给父类 Object obj 就相当于

obj = aa2

所以可以通过强制转换

A aa = (A)obj

达到访问子类所以特有的属性方法

如果把

if(aa.i == this.i)
//改成
if(obj.i == this.i)

答案是会报错,因为前面说了,父类的对象是不可以直接访问子类对象所特有的属性方法~!

© 著作权归作者所有

上一篇: 【2】类和对象
下一篇: 【4】接口interface
elson1024
粉丝 5
博文 4
码字总数 2123
作品 0
广州
私信 提问
java基础:==和equals方法区别

equals()和“==”操作用于对象的比较,检查俩对象的相等性,但是他们俩的主要区别在于前者是方法后者是操作符。由于java不支持操作符重载(overloading),“==”的行为对于每个对象来说与equ...

watermelon11
02/23
21
0
Java hashCode() 和 equals()的若干问题解答

本章的内容主要解决下面几个问题: 1、 equals() 的作用是什么? 2 、equals() 与 == 的区别是什么? 3、 hashCode() 的作用是什么? 4 、hashCode() 和 equals() 之间有什么联系? 第1部分 ...

刘诗书
2017/11/27
0
0
第8条:覆盖equals时请遵守通用约定

1、equals方法 1.1、简介 equals()方法,定义在Object类中,源码如下:   也就是说,在Object类中,比较的是两个对象的引用是否相同。   当我们创建一个新的类而没有覆盖equals方法时,调...

添仔哥哥
2017/08/20
26
0
hashCode() 和 equals()

第1部分 equals() 的作用 equals() 的作用是 用来判断两个对象是否相等。 equals() 定义在JDK的Object.java中。通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否相等。源...

小菜鸡1
2016/08/17
36
0
Java之hashCode()和equals()方法

程序世界和现实世界其实是一样的,相等和相同是不同的概念,就此简要说明一下其中的含义: 1 equals() 的作用是什么? 2 equals() 与 == 的区别是什么? 3 hashCode() 的作用是什么? 4 hash...

董广明
2014/04/01
586
3

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
7
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
昨天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
昨天
2.5K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
昨天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部