Object类之equals方法
public boolean equals(Object obj)方法
- 提供定义对象是否“相等”的逻辑。
-定义为:x.equals(y), 当x 和 y 是同一个对象的引用时返回true,否则返回false
-J2SDK提供一些类,如String,Date等,重写了Object的euqals方法调用这些类的equals方法,只要满足是同一类对象,且属性内容相等,即可判断是否相同。
public class TestEquals{
public static void main (String args[]){
Cat c1 = new Cat(1,2,3);
Cat c2 = new Cat(1,2,3);
System.out.println(c1.equals(c2)); //探测两个对象是否一样
}
}
class Cat {
int color;
int height, weight;
public Cat(int color, int height, int weight){
this.color = color;
this.height = height;
this.weight = weight;
}
}
结果:false
为什么所有实参都一样,得不到相等结果?
解释:在堆内存中的两个对象的地址不一样,所以无论new 多少个相同对象出来,地址都不一样,不会相同。
如何确定两个对象相同?
解决方法:不比较引用,比较对象,这里就要运用equals方法(查询API)
重写equals方法
public boolean equals(Object obj){
if(obj== null) return false;
else {
if(obj instanceof Cat){
Cat c = (Cat) obj; //obj类型强制转换成Cat类型
if (c.color == this.color && c.height = this.height; && c.weight == this.weight)
{return true;}
}
}
}
总结:equals 方法可以根据用户需求来进行重写,进而比较是否相等。
对象转型(casting)
-一个基类的引用类型变量可以“指向”其子类的对象;
-一个基类的引用不可以访问其子类对象新增的成员(属性和方法);
-可以使用引用变量instanceof 类名 来判断该引用型变量所指向的对象是否属于该类或该类的子类;
-子类的对象可以当做基类的对象来使用称向上转型 (upcasting),反之称为向下转型(downcasting)。
动态绑定和多态:
动态绑定:也称 “多态” 也称“迟绑定”,是指在执行期间(非编译期间)判断所引用对象的实际类型,根据其类型的类型调用其相应的方法,使可拓展性达到最好。
多态的必要条件:
1.继承
2.重写
3.父类引用指向子类对象
class Animal {
private String name;
Animal (String name) {this.name = name};
public void enjoy(){
System.out.println(" 叫声·····");
}
}
class Cat extends Animal {
private String eyesColor;
Cat(String n, String c) {super(n); eyeColor = c;}
public void enjoy() {
System.out.println("猫叫声······");
}
}
class Dog extends Animal {
private String furColor;
Dog(String n, String c) {super(n); furColor = c;}
public void enjoy() {
System.out.println(" 狗叫声······");
}
}
class Lady {
private String name;
private Animal pet;
Lady(String name, Animal pet){
this.name = name;
this.pet = pet;
}
public void myPetEnjoy(){pet.enjoy();}
}
public class Test {
Lady l1 = new Lady ("l1", c);
Lady l2 = new Lady("l2", d);
l1.myPetEnjoy();
l2.myPetEnjoy();
}
解释:l1.myPetEnjoy(); 在实际内存中,本调用的是Animal 的enjoy方法,但是由于Java的动态绑定功能,在执行期间,调用的是对应的类中对应的方法,
也就是说,调用了Cat 类中的 enjoy方法而非Animal类中的enjoy方法,这就是动态绑定。
此外,动态绑定有极大的灵活性,如果需要添加一个类,如Bird类,那么,创建一个class Bird,然后再Test class 中 添加:
Lady l3 = new Lady("l3",b);
l3.myPetEnjoy();
即可,不需要改变任何主框架,这就是多态的拓展性。
但是必须要记住使用多态的必要条件!!!!!
---------------------------------------------------------------------------end---------------------------------------------------------------------
欢迎补充和互动