您的位置:首页 > 移动开发 > Objective-C

java小记之Object类的equals方法t

2016-11-24 22:00 387 查看
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---------------------------------------------------------------------

欢迎补充和互动 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: