面向对象--instanceof,equals方法



 

public class Point {

  double  x;           //定义成员变量

  double  y;

 

  public Point (double x ,double y){ //构造方法,初始化成员变量

    this.x = x;

    this.y = y;

   

  }

 

/* @Override //判断是否重写

  public booleanequals(Object obj){    //equals,传入obj类型,判断两个对象是否相等

                                     //equals重写了Object类中的方法

                                     //Object类是所有JAVA类的根基类

                                     //如果在类的声明中未使用extends关键字指明其基类,

                                      //则默认基类为Object

                      //引用类型比较的是内存地址(对象)是否相等

                      //基本类型比较的是值是否相等if(i == 1){}

 

    if(this == obj)   // objobj先比

      return true;

    if(obj == null)   //obj和空相比

      return false;

    if(getClass() != obj.getClass()) //等价于 (obj instanceof Point) //为什么用getClass????

      return false;

    Point other = (Point)obj;

    if (Double.doubleToLongBits(x) !=Double.doubleToLongBits(other.x))//用位运算,效率高,但不常用,太麻烦,这是一个优化点。

      return false;

    if (Double.doubleToLongBits(y) != Double.doubleToLongBits(other.y))

      return false;

    return true;

*/  

    public boolean equals(Object obj) {

     

      //引用 变量 instanceof 类名

        //来判断该引用类型变量所“指向”的对象是否属于该类或该类的子类

        //子类的对象可以当做基类的对象来使用称作向上转型,反之称为向下转型

   

     

      if(this == obj){

        return true;

      }

      if(obj == null){

        return false;

      }

      if(obj instanceof Point){

        Point bPoint = (Point)obj;//obj强转为point类型地址

        if(bPoint.x == this.x && bPoint.y == this.y){

          return true;

        }

      }

        return false;

     

    }

   

}

 第一种:

看代码1:
String s1 = "hello";
String s2 = "hello";
结果
s1 == s2为true,
解释
s1 与 s2 引用同一个 String 对象 。
看代码2:
String s1 = "hello";
String s2 = new String("hello");
结果
s1 equals s2为true,解释
s1 s2分别引用了两个"hello"String对象,new 操作符,表示新的Sting对象被创建在内存中



==:等于
如果进行被比较的两个操作数都是数值类型,也就是8种基本数据变量之一,即使他们的数据类型不一样,
只要值相同,就返回true,如97==‘a’返回true,5.0=5,返回true。
如果操作的数是引用类型,或者也叫复核数据类型,那么只有当两个引用变量引用相同的类的实例的时候才可以比较,
而且两个引用必须指向同一个对象才会返回true。


第2种:

1、instanceof:用法:
int  boolean  是值数据类型      而instanceof  只能 用于 对象 类型
  例如
正确:
Integer i;
      if(i instanceof Integer)
         System.out.println("i 是 Integer类型");
错误:
  int i;
    if(i instanceof int)
       System.out.println("i 是 int类型");

2、equals()方法是从object类中继承过来的。

equals()方法在object类中定义如下:

public boolean equals(Object obj) {

return (this == obj);
}
很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。是进行的内容比较,而已经不再是地址的比较。依次类推Double、Integer、Math。。。。等等这些类都是重写了equals()方法的,从而进行的是内容的比较。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猿成长

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值