toString方法
Object类中定义了toString()方法,返回对象的字符串表示。默认返回的是类名@哈希码的十六进制形式。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}Code language: JavaScript (javascript)
当使用System.out.println(对象)时,会自动调用该对象的toString()方法。
实际开发中通常会重写toString()方法,返回更有意义的对象信息。
class Student {
String name;
int age;
@Override
public String toString() {
return "Student{name='" + name + "', age=" + age + "}";
}
}Code language: JavaScript (javascript)
hashcode方法
hashCode()方法返回对象的哈希码值,是一个int类型的值。
同一个对象在程序的一次执行期间,多次调用hashCode()应当返回相同的整数,前提是对象中用于equals比较的信息没有被修改。
如果根据equals()方法两个对象相等,那么对这两个对象分别调用hashCode()应当产生相同的整数结果。
如果重写了equals()方法,通常也需要重写hashCode()方法,以保持equals相等则hashCode相等的约定。
class Student {
String name;
int age;
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}Code language: JavaScript (javascript)
equals方法
equals()方法用于判断两个对象是否相等。Object类中的默认实现是比较对象引用是否指向同一个内存地址。
public boolean equals(Object obj) {
return (this == obj);
}Code language: JavaScript (javascript)
实际开发中通常需要重写equals()方法,根据对象的属性来判断逻辑上的相等性。
class Student {
String name;
int age;
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Student student = (Student) obj;
return age == student.age && name.equals(student.name);
}
}Code language: JavaScript (javascript)
对象转型
一个基类的引用可以指向子类对象
Father f = new Son();Code language: JavaScript (javascript)
一个基类的引用不可以访问其子类对象新增的成员,包括属性和方法。
可以使用引用变量instanceof类名来判断该类型变量所指向的对象是否属于该类或者该类的子类
Son s = new Son();
boolean b = s instanceof Father; // trueCode language: JavaScript (javascript)
子类对象可以当作基类的对象来使用称为向上转型,反之称为向下转型。
Father f = new Son(); // 向上转型,自动完成
Son s2 = (Son) f; // 向下转型,需要强制类型转换Code language: JavaScript (javascript)
向下转型前通常需要先用instanceof判断,否则可能出现ClassCastException。
Father f = new Son();
if (f instanceof Son) {
Son s = (Son) f;
}Code language: JavaScript (javascript)