为啥 String类下面equals如果内容一样的可以返回true?
1.当父类的需求满足不了子类的需求
2.String类重写了Object类的equals
equals:
public boolean equals(Object obj)方法 是objct类中的方法
1.比较内存地址 如果内存地址是一样 肯定一样
2.然后比较内容 内容一样返回true
String中的 equals方法是被重写过的,因为 Object的 equals方法是比较的对象的内存地址,而 String的 equals方法比较的是对象的值。
当创建 String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String对象。
==:
【1】如果比较的对象是基本数据类型,则比较数值是否相等;
【2】如果比较的是引用数据类型,则比较的是对象的内存地址是否相等。
public boolean equals(Object obj) { //object obj = student2 // object obj = new Student 向上转型
if (this==obj) {
return true; //先判断内存地址是否相等,在Java中对象的内存地址相同,说明指向的数据是同一个,内容也就相等
}
//如果内存地址不相等,那么继续往下走,判断内容是否相等
//此时obj为 student2 如果它不是Student父类的子类或Student的实例,说明obj的内容与Student无关,就直接返回false
//如果相关下面进行内容比较
if (obj instanceof Student) {
Student student =(Student)obj;
//向下转型 Student的引用指向student2的实例
return this.name.equals(student.name)&&this.age==student.age;
//此时this和student的age属性都是int类型 == 号的作用不再是判断内存地址是否相等,而是变成了判断数值是否相等
//此时this是studeng其数据类型是string数据类型,调用equals方法是已经重写过的方法,先判断内存地址,内存地址不一样会继续判断内容,内容为true返回是true
}
return false;
}