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) // obj和obj先比
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()方法的,从而进行的是内容的比较。