多态:父类引用指向子类引用。(如果父类是Object,其实指向的是子类对象中的object)
代码块
public class Test {
public static void main(String[] args) {
Person p1 = new Person(1,"S");
Person p2 = new Person(1,"S");
System.out.println(p1.equals(p2));
}
}
class Person{
int id;
String name;
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public boolean equals(Object obj){
Person p = (Person)obj;
if (id == p.id)return true;
return false;
}
}
详解:
关于内存存在情况:
代码解释:
代码解释1. public boolean equals(Object obj)
参数obj指向的是P2中的obj,因为main函数中p1.equals(p2),传入的是p2这个对象,尽管传入的是p2对象,但是obj指向的是p2内部的obj
验证这一点也可以通过调用obj的方法来验证,如图:
可以看出此obj对象可以使用的方法只有来自Object类的。
代码解释2. Person p = (Person)obj;
当强制类型转换后,p不再指向p2中的obj,而是指向Person这个类。
验证这一点也可以通过调用obj的方法来验证,如图:
可以看出此p对象可以使用的方法不仅有来自Object类的,还有Person类的方法于属性。
优化代码:
if (id == p.id)return true;
return false;
此段代码等同于
return this.id == p.id;
可能这段代码刚开始不理解,但是如果换种思维就明白了。参看以下代码:
public class TestString {
public static void main(String[] args) {
int num1 = 2;
int num2 = 2;
System.out.println(num1 == num2);
int num3 = 3;
System.out.println(num1 == num3);
}
}
运行结果:
true
false
因为返回值是int类型,所以可以直接 return this.id == p.id;