第八十九课.Object-2
1.为什么equals()方法要重写?
判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象。这样我们往往需要重写equals()方法。我们向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals方法。
重写equals方法的要求:
1、自反性:对于任何非空引用x,x.equals(x)应该返回true。
2、对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
3、传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
4、一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。
5、非空性:对于任意非空引用x,x.equals(null)应该返回false。
2.为什么要重写toString()方法
在Object类里面定义toString()方法的时候返回的对象的哈希code码,这个hashcode码不能简单明了的表示出对象的属性。所以要重写toString()方法。
当需要将一个对象输出到显示器时,通常要调用他的toString()方法,将对象的内容转换为字符串.java中的所有类默认都有一个toString()方法。
默认情况下 System.out.println(对象名)或者System.out.println(对象名.toString())输出的是此对象的类名和此对象对应内存的首地址如果想自定义输出信息必须重写toString()方法。
注意事项:
1.必须被声明为public
2.返回类型为String
3.方法的名称必须为toString,且无参数
4.方法体中不要使用输出方法System.out.println()
代码:
package com.xuenixiang.web;
public class Super1 {
protected String name;
private String address;
public Super1() {
System.out.println("父类无参构造被调用");
}
public Super1(String name,String address) {
System.out.println("父类有参构造被调用");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
package com.xuenixiang.web;
public class Super2 extends Super1 {
private int age;
public Super2() {
System.out.println("子类无参构造被调用");
}
public Super2(String name, String address) {
this();
//super(name,address);
//System.out.println("子类有参构造被调用");
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String Mingzi) {
this.name = Mingzi; // 子类对父类的setName进行重写
System.out.println("父类的setName方法被重写");
}
public boolean equals(Object obj) {//重写equals,实现 比较对象内容而不是比较地址
if(obj==null)
return false;//如果只对Super2这个类定义的对象 实现比较对象内容这个功能,就不需要强制转换
Super2 Temp=(Super2)obj;//把传进来的对象转换为Super2类型
System.out.println("equals方法被重写");
if((this.getName()==Temp.getName())&&(this.getAddress()==Temp.getAddress()))
return true;
else
return false;
}
public String toString() {//重写toString,实现 能返回具体内容而不是地址
return this.getName()+'\t'+this.getAddress();
}
public void xuenixiang() {
System.out.println("网站名:" + this.getName());
System.out.println("网站地址:" + this.getAddress());
System.out.println("网站年龄:" + this.getAge());
}
public static void main(String[] args) {
Super2 xnx = new Super2();
xnx.setName("学逆向论坛");
xnx.setAddress("www.xuenixiang.com");
xnx.setAge(1);
xnx.xuenixiang();
Super2 xnx1 = new Super2();
xnx1.setName("学逆向论坛");
xnx1.setAddress("www.xuenixiang.com");
xnx1.setAge(1);
xnx1.xuenixiang();
System.out.println(xnx.equals(xnx1));
System.out.println(xnx.toString());
}
}
运行结果: