http://www.verejava.com/?id=16992832835152
/**
知识点: Object 类
注意:
1. Object 是所有类的根类, 也就是说所有类默认都继承Object 只是省略没有写
2. 当 println()输出一个对象的时候 自动调用了 Object的 toString() 方法
3. Object toString() 方法返回的是 : 类名+@+16进制的哈希码hashCode地址
哈希码 代表对象的内存地址,所以如果比较两个对象的引用相等==必须 哈希码相等
4. Object equals(Object obj) 方法比较的也是引用内部是以==实现的
5. String 对象的equals()方法怎么是比较内容了?
6. 如果要equals()比较两个对象的内容相等我们需要复写equals 方法
7. 当Object的子类复写了 toString() 方法, println()输出时调用子类复写的 toString() 方法
8. 如果复写了equals()方法,为了保证对象相等哈希码hashcode必须相等的特性,
我们也要复写hashCode()方法使保持对象的一致性
9. Object 可以接收任意引用数据类型(类,数组,接口)
回顾知识点:
1. 如果一个类定义了带参数的构造方法, 当用不带参数的构造方法调用时,java
虚拟机不会自动生成默认的构造方法,必须得手动显示定义不带参数的默认构造方法。
*/
public class TestObject {
public static void main(String[] args) {
//实例化一个 Student
Object p = new Student("李明");
Student p2 = (Student) p;
Student p3 = new Student("张涛");
Student p4 = new Student("李明");
System.out.println(p);
System.out.println(p == p2);
System.out.println(p3);
System.out.println(p.equals(p3));
System.out.println(p == p4);
System.out.println(p.equals(p4));
System.out.println(p);
System.out.println(p4);
Person p5 = new Student("李明");
System.out.println(p4.equals(p5));
String[] p6 = new String[1];
p6[0] = "李明";
System.out.println(p4.equals(p6));
}
}
interface Person {
//什么人可以说话
public void say();
}
class Student extends Object implements Person {
private String name;
public Student() {
}
public Student(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void say() {
System.out.println("学生会说英语");
}
public boolean equals(Object obj) {
//如果地址都相等, 两个对象肯定相等
if (this == obj) {
return true;
}
//判断是否是 Student 对象实例
if (obj instanceof Student) {
//将obj向下转型成 Student
Student p = (Student) obj;
//如果内容相等返回true
if (this.name.equals(p.getName())) {
return true;
}
}
return false;
}
public int hashCode() {
return this.name.hashCode();
}
public String toString() {
return this.name;
}
}